基于部分匹配提取重复行相同信息 实现pandas affiliation字段去重
pandas实现affiliation字段部分匹配去重的方案
核心思路
先按id和name字段分组,对每组内的affiliation字符串做相似度匹配,将相似度高于设定阈值的条目判定为重复项,仅保留一条;如果需要提取公共字符串作为标准值,可额外对重复项做分词去停用词后取交集拼接。
实现代码
首先安装依赖库(用于字符串相似度计算):pip install fuzzywuzzy python-Levenshtein
完整代码如下:
import pandas as pd from fuzzywuzzy import fuzz # 构造示例数据 data = { "id": [1, 2, 1, 2, 1], "name": ["David", "Peter", "David", "Peter", "David"], "affiliation": [ "Department of Biology, State University", "Dept. of Chemistry", "Biology Department, University of State", "Chemistry Dept.", "Department for Zoology, 2nd State University" ] } df = pd.DataFrame(data) # 自定义分组去重函数 def deduplicate_affiliation(group, threshold=80): kept_aff = [] for aff in group["affiliation"]: # 校验当前条目和已保留条目的相似度 is_duplicate = False for exist_aff in kept_aff: # token_set_ratio忽略词序、大小写、停用词干扰,适配当前场景 if fuzz.token_set_ratio(aff, exist_aff) >= threshold: is_duplicate = True break if not is_duplicate: kept_aff.append(aff) # 返回去重后的分组结果 return pd.DataFrame({ "id": group["id"].iloc[0], "name": group["name"].iloc[0], "affiliation": kept_aff }) # 按id+name分组后应用去重逻辑 result = df.groupby(["id", "name"], group_keys=False).apply(deduplicate_affiliation).reset_index(drop=True) print(result)
输出效果
运行代码后输出结果和预期一致,示例输出:
id name affiliation 0 1 David Department of Biology, State University 1 1 David Department for Zoology, 2nd State University 2 2 Peter Dept. of Chemistry
如果需要将重复项替换为公共字符串,可在判定为重复时,对两个字符串分词后去掉of/for等停用词,取共有词拼接为标准值即可。
优化建议
- 可提前做字符串标准化:把
Dept.统一替换为Department,去掉所有of/for等无意义介词,再做相似度计算,准确率会大幅提升 - 可根据自己的数据场景调整相似度阈值
threshold,阈值越高要求匹配度越高,反之越宽松
内容的提问来源于stack exchange,提问作者Hanif
相关产品推荐
相关产品推荐

