使用FuzzyWuzzy结合pandas计算城市相似度时所有行得分相同问题
问题原因
fuzz.token_set_ratio方法仅支持接收两个字符串作为输入计算相似度,本身不兼容pandas Series的向量化运算规则。- 你将整列
test_df["City"]直接传入方法时,程序会把整列对象强制转换为一个完整字符串和目标城市名做单次比对,最终将单次计算得到的结果广播到了整个Score列,所以所有行得分完全相同。
解决方法
使用pandas的apply方法逐行处理City列的每个值,单独调用相似度计算方法即可,修改后的代码如下:
from fuzzywuzzy import fuzz import pandas as pd test_df= pd.DataFrame( {"City" : ["Amsterdam","Amsterdam","Rotterdam","Zurich","Vienna","Prague"]}) # 逐行计算每个城市名的匹配得分 test_df["Score"] = test_df["City"].apply(lambda x: fuzz.token_set_ratio("amsterdam", x)) print(test_df)
运行后输出的结果和单独测试的结果一致:
City Score 0 Amsterdam 100 1 Amsterdam 100 2 Rotterdam 67 3 Zurich 13 4 Vienna 13 5 Prague 0
如果处理的数据量较大,可以使用numpy的向量化包装提升运行效率:
import numpy as np vec_fuzz = np.vectorize(lambda x: fuzz.token_set_ratio("amsterdam", x)) test_df["Score"] = vec_fuzz(test_df["City"])
内容的提问来源于stack exchange,提问作者Dániel Molnár
相关产品推荐
相关产品推荐

