
本文介绍如何在 Pandas 中实现基于自定义逻辑(如编辑距离、子字符串重叠)的重复行识别与合并,替代默认的 duplicated() 或 groupby() 行为,并保持数值列求和、非数值列保留首行值。
本文介绍如何在 pandas 中实现基于自定义逻辑(如编辑距离、子字符串重叠)的重复行识别与合并,替代默认的 `duplicated()` 或 `groupby()` 行为,并保持数值列求和、非数值列保留首行值。
在实际数据清洗中,标准的 df.duplicated(subset=['A','B']) 往往无法满足复杂语义层面的“重复”定义——例如,当两行的英文拼写接近(Levenshtein 距离 ≤1)且西班牙语完全一致时,或英文完全相同但西班牙语存在词元重叠(如 'hola' 与 'hola_a' 分割后集合交集非空)时,才应视为重复。Pandas 原生不支持此类多条件、跨字段、带字符串处理的自定义去重逻辑,需结合 Python 函数与显式循环/分组策略实现。
以下是一个完整、可复用的解决方案:
✅ 步骤一:安装依赖
pip install python-Levenshtein
⚠️ 注意:
python-Levenshtein比纯 Python 实现快数十倍,强烈推荐;若安装失败,可用pip install Levenshtein(功能一致,但性能略低)。
✅ 步骤二:定义自定义重复判定函数
该函数严格遵循题设三类规则:
- 英文完全相等 + 西班牙语按
_分割后集合有交集 → 重复; - 英文编辑距离 (默认 1)+ 西班牙语完全相等 → 重复;
- 其他情况(如仅英文近似 或 仅西班牙语部分重叠)→ 不视为重复。
iterrows()
-
性能提示:上述算法时间复杂度为 O(n²),适用于万级以下数据。若需处理十万+行,建议先按
Spanish分组(groupby('Spanish')),再在每组内对English做聚类(如scikit-learn的 AgglomerativeClustering + 自定义距离矩阵),可降至 O(n log n)。 -
扩展性:将
are_duplicates改为接受columns_to_compare和rules字典参数,即可适配任意字段组合与规则组合。 -
稳定性:
Levenshtein.distance对空字符串返回长度,务必确保English列无缺失值(可用df.dropna(subset=['English'])预处理)。 -
保留首行非数值字段:当前逻辑天然保留
iloc[i]的English/Spanish,符合“保留第1行语言列”的需求;如需保留最长/最规范的字符串,可在合并时添加max(..., key=len)逻辑。
通过该方法,你不再受限于 Pandas 的结构化去重范式,而是拥有了完全可控的语义级重复识别能力——这正是高质量文本数据工程的关键一环。










