You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,无需额外做表关联即可定位原始记录

示例原始DataFrame
全量匹配计算结果参考

小提示:如果数据集规模较大,可在计算完相似度后增加阈值过滤(比如仅保留fuzz_ratio大于80的结果),减少不必要的内存占用。

内容的提问来源于stack exchange,提问作者Chuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:06:40