pandas dataframe使用fuzzywuzzy模糊匹配名称仅返回自身问题排查
问题原因
- 未排除当前行自身的匹配结果:
fuzz.partial_ratio计算两个完全相同的字符串时返回值为100,必然高于你设置的50阈值,因此每行自身一定会被纳入结果列表,这是你现在输出仅包含自身名称的核心原因。 - 原有函数设计存在缺陷:你仅向
check_name函数传入了当前行的名称字段,没有传入当前行的索引,无法区分匹配结果中哪些属于当前行自身、哪些属于其他行的匹配结果,无法完成排除逻辑。
修复代码
from fuzzywuzzy import fuzz import pandas as pd # 提前提取名称列表和对应索引,避免每次apply重复遍历全表,提升执行效率 all_names = df['Name'].tolist() all_indexes = df.index.tolist() def get_similar_names(current_idx, current_name, threshold=50): similar_list = [] for idx, name in enumerate(all_names): # 先排除当前行自身,再校验相似度阈值 if all_indexes[idx] != current_idx and fuzz.partial_ratio(name, current_name) >= threshold: similar_list.append(name) return similar_list # apply调用时同时传入行索引(row.name为pandas行对象的内置索引属性)和名称字段 df['Checked'] = df.apply(lambda row: get_similar_names(row.name, row['Name']), axis=1)
运行上述代码即可得到你预期的输出结果。如果你的数据量较大(行数超过1000),可以考虑预计算相似度矩阵进一步优化执行效率,避免O(n²)的重复计算。
内容的提问来源于stack exchange,提问作者LdM
相关产品推荐
相关产品推荐

