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

如何基于两列完全匹配、第三列字符串相似度用pandas去重

实现方案

核心思路是先按ID、Name两列分组(仅前两列完全相同的行才需要做重复判定),再在每个分组内自定义地址相似度规则去重,具体实现如下:


1. 自定义相似度判定规则

你可以根据业务需求调整地址相似的判定逻辑,以下示例采用字符集合交集大小作为共同字符数判定标准,也可替换为最长公共子串、编辑距离等其他相似度算法:

def calc_common_char_count(s1: str, s2: str) -> int:
    # 计算两个字符串的共同字符数
    return len(set(s1) & set(s2))

2. 分组去重实现

import pandas as pd

# 构造示例数据,实际使用时替换为你的数据读取逻辑
data = [
    [2, "Smith", "123 Main Street, Redwood, IL, 12345"],
    [2, "Smith", "123 Main, Redwood, 12345"],
    [2, "Smith", "123 Mn Street, Redwood, 12345"],
    [2, "Smith", "456 E. Wallace Drive, Morona, Washington"]
]
df = pd.DataFrame(data, columns=["ID", "Name", "Address"])

def group_deduplicate(group, common_threshold: int = 15):
    keep = []
    for _, row in group.iterrows():
        duplicate = False
        # 与已保留的行逐一比对地址相似度
        for kept in keep:
            common_cnt = calc_common_char_count(row["Address"], kept["Address"])
            if common_cnt >= common_threshold:
                duplicate = True
                break
        if not duplicate:
            keep.append(row)
    return pd.DataFrame(keep)

# 按前两列分组后应用去重逻辑,common_threshold可根据实际场景调整
result = df.groupby(["ID", "Name"], group_keys=False).apply(group_deduplicate).reset_index(drop=True)

# 输出结果
print(result)

运行输出

ID   Name                                     Address
0   2  Smith        123 Main Street, Redwood, IL, 12345
1   2  Smith  456 E. Wallace Drive, Morona, Washington

如果需要保留指定行(比如最长的地址、最后录入的地址),可以先对分组内的行按规则排序后再遍历即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:48:00