进行模糊匹配时出现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 个字符串之间获得最佳匹配的完整代码 -
- 使用
itertools
获取 a 和 b 的组合 lists/series。
- 直接在每个组合上使用 `Fuzz 中的记分器。
- 使用
np.argmax
获取最高分的索引
- 获取具有最佳匹配的 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
需要 query
和 choices
。它 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)
我在 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 个字符串之间获得最佳匹配的完整代码 -
- 使用
itertools
获取 a 和 b 的组合 lists/series。 - 直接在每个组合上使用 `Fuzz 中的记分器。
- 使用
np.argmax
获取最高分的索引 - 获取具有最佳匹配的 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
需要 query
和 choices
。它 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)