Python pandas drop_duplicates删除指定列重复值失效问题
去重失效排查及解决步骤
去重不管在pandas还是Excel里都失效,核心原因是你肉眼判定为重复的内容,在系统字符匹配规则下存在差异,或者你代码指定的去重列根本不是你以为的目标列,按以下步骤排查即可:
第一步:先确认真实列名,不要靠肉眼判断
执行以下代码打印所有列名,排查列名是否存在前后空格、零宽字符、UTF-8 BOM头:print(df.columns.tolist())常见问题:
- 你描述的重复列名叫
file,但代码里subset参数传的是"Fichier",列名不匹配的话代码根本不会处理目标列 - 列名前后带空格(比如实际列名是
" file ")、带零宽字符、带BOM头(比如实际列名是"\ufeffFichier"),这类差异肉眼完全无法识别 - 如果打印出来列名带
\ufeff,读CSV的时候把编码改成utf-8-sig即可自动修复:df = pd.read_csv(path_to_file, encoding='utf-8-sig', sep=',')
- 你描述的重复列名叫
第二步:对目标列的值做标准化清洗
90%以上“看着一样但去重失败”的问题,都是值里带看不见的差异:前后空格、零宽字符、不可见控制字符,先统一清洗再去重:# 把target_col替换成上一步打印出来的、你实际要去重的真实列名 target_col = "真实目标列名" # 统一转字符串,去掉前后空白字符 df[target_col] = df[target_col].astype(str).str.strip() # 移除常见的零宽不可见字符、BOM残留 df[target_col] = df[target_col].str.replace(r'[\u200b\u200c\u200d\ufeff]', '', regex=True)第三步:先验证重复值再执行去重
不要直接调用drop_duplicates,先统计重复情况确认清洗生效:# 统计目标列每个值的出现次数,确认是否存在重复 print(df[target_col].value_counts()) # 标记重复行,可导出核对判定结果是否符合预期 df['is_duplicate'] = df.duplicated(subset=target_col, keep='first') df[df['is_duplicate']].to_csv('重复值核对.csv', index=False, encoding='utf-8-sig')核对无误后再执行去重即可:
df.drop_duplicates(subset=target_col, keep='first', inplace=True) # 可选:删除临时加的重复标记列 df.drop(columns=['is_duplicate'], inplace=True)
注:Excel去重失败和pandas失效逻辑完全一致——Excel判定重复要求字符100%匹配,只要存在看不见的字符差异、全半角字符差异,就不会判定为重复,不是工具故障。
内容的提问来源于stack exchange,提问作者Balkhrod
相关产品推荐
相关产品推荐

