进行模糊匹配时出现TypeError

TypeError while doing fuzzy matching

我在 2 个不同数据帧中的 2 列之间进行模糊匹配时遇到类型错误。我已经处理了 nan 并将数据类型转换为字符串,但它仍然失败。我也无法弄清楚是哪个值导致了这个错误。我已经尝试使用 for 循环逐一进行匹配,但是代码永远不会失败。另外,我不想为此使用 for 循环。

错误信息是:TypeError: expected string or bytes-like object

密码是:

a = df1['ColAddress1'].dropna()  
b = df2['ColAddress2'].dropna()
match = process.extractOne(a, b, scorer=fuzz.partial_token_sort_ratio)

我无法共享数据,但它包含 4 种类型的字符: 字母 [a-zA-Z]、数字、破折号 (-) 和方括号 ([])

任何人都知道我该如何解决这个问题。

更好的替代你的目标

在 2 lists/series 个字符串之间获得最佳匹配的完整代码 -

  1. 使用 itertools 获取 a 和 b 的组合 lists/series。
  2. 直接在每个组合上使用 `Fuzz 中的记分器。
  3. 使用np.argmax获取最高分的索引
  4. 获取具有最佳匹配的 2 个字符串的元组。
import itertools
from fuzzywuzzy import fuzz
import numpy as np

a = ['hi','there']  
b = ['hello','their']

scores = [fuzz.partial_token_sort_ratio(i, j) for i,j in itertools.product(a,b)]
list(itertools.product(a,b))[np.argmax(scores)]
('there', 'their')

解决问题

process.extractOne 需要 querychoices。它 returns 与选项中的查询最匹配。

Query 是一个字符串,Choices 是您要比较的字符串的 list/Series。目前,您正在传递它 2 系列。而是在其中一个系列上使用循环,以获得与另一个系列的 Choices 的最佳匹配。

from fuzzywuzzy import fuzz, process

a = ['hi','there']  
b = ['hello','their']
match = [(i,*process.extractOne(i, b, scorer=fuzz.partial_token_sort_ratio)) for i in a]
match
[('hi', 'hello', 50), ('there', 'their', 80)] #query, bestchoice, score

如果你想要这个列表中的最大元组,只需使用 -

import numpy as np
match[np.argmax([i[2] for i in match])]
('there', 'their', 80)