Pandas同列模糊匹配如何基于唯一ID排除记录自匹配
同列模糊匹配过滤自匹配方案
你当前的实现只对name字段做笛卡尔积生成匹配对,没有绑定每条记录的唯一ID,因此无法识别并剔除记录和自身的无效配对。只要在生成匹配对时同步携带ID字段,计算完相似度后过滤掉两侧ID相等的条目即可,不同ID的同名相似匹配会完整保留。
修正后可直接运行的代码
import pandas as pd from fuzzywuzzy import fuzz # 示例DataFrame df = pd.DataFrame({'id':[1, 2, 3], 'name':['pizza','pizza toast', 'ramen']}) # 生成笛卡尔积时同时携带id与name,而非仅使用name字段 compare = pd.MultiIndex.from_product( [df[['id', 'name']].values, df[['id', 'name']].values] ).to_series() def calc_similarity(tup): left_id, left_name = tup[0] right_id, right_name = tup[1] return pd.Series( [left_id, right_id, fuzz.ratio(left_name, right_name), fuzz.token_sort_ratio(left_name, right_name)], index=['left_id', 'right_id', 'fuzz_ratio', 'token_sort_ratio'] ) # 计算全量匹配对相似度 match_result = compare.apply(calc_similarity).reset_index(drop=True) # 核心过滤:剔除左右ID完全相同的自匹配项 filtered_result = match_result[match_result['left_id'] != match_result['right_id']].reset_index(drop=True)
效果说明
- 无效自匹配(即配对两侧为同一条记录、ID完全一致)会被全部剔除
- 有效匹配(如ID=1的
pizza和其他ID下的pizza记录)不会被误删 - 输出结果直接携带两侧记录的唯一ID,无需额外做表关联即可定位原始记录


小提示:如果数据集规模较大,可在计算完相似度后增加阈值过滤(比如仅保留
fuzz_ratio大于80的结果),减少不必要的内存占用。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

