drop_duplicates() 有时删不掉明显重复行,主要因csv中存在隐藏差异(如尾部空格、bom、不可见字符)、nan与空字符串混用、未指定subset导致全列判重误判,或编码/分隔符不一致引发读取失真。

直接用 pandas.read_csv() 加 drop_duplicates() 就能搞定,但实际跑起来常因编码、空值、列选择或原地写入逻辑出错——关键不在“能不能删”,而在“删得准不准、稳不稳”。
为什么 drop_duplicates() 有时删不掉明显重复的行?
常见原因是 CSV 中存在隐藏差异:尾部空格、全角/半角空格、NaN 和空字符串混用、或者某列是字符串但含不可见字符(如 \ufeff BOM)。另外,默认对所有列判重,若只想按业务主键(比如 id 或 email)去重,不指定 subset 参数就会漏判或误删。
- 读取时加
encoding='utf-8-sig'消除 BOM 影响 - 对关键列先做
str.strip()清洗再判重:df['email'] = df['email'].str.strip() - 明确指定去重依据:
df.drop_duplicates(subset=['user_id', 'order_date'], keep='first') -
keep='first'保留首条,keep=False则只留唯一行(即完全剔除所有重复组)
处理大文件时内存爆了怎么办?
pandas 默认把整个 CSV 加载进内存,千万行以上容易 OOM。此时不能硬扛,得换策略:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 用
chunksize分块读取 + 全局哈希去重:seen = set()记录已见过的tuple(row[subset_cols]),逐块过滤 - 避免用
df.append()累积结果(已弃用且慢),改用pd.concat([list_of_dfs], ignore_index=True) - 更稳的做法是改用
dask.dataframe:dd.read_csv(...).drop_duplicates().to_csv(...),自动并行+延迟计算 - 极端情况(如 10GB+)建议预处理为 Parquet 格式,后续去重快一个数量级
如何确保输出 CSV 与原始格式一致(编码、分隔符、换行)?
直接 df.to_csv('out.csv') 很可能破坏原始格式:默认用 , 分隔、utf-8 编码、\n 换行,而原始文件可能是 gbk、; 分隔、\r\n。一旦错配,Excel 打开乱码或列错位。
- 读取时记下参数:
df = pd.read_csv('in.csv', sep=';', encoding='gbk', lineterminator='\r\n') - 写入时严格复用:
df.to_csv('out.csv', sep=';', encoding='gbk', line_terminator='\r\n', index=False) - 特别注意
index=False,否则多出一列序号 - 如果原始有 BOM,写入也应加
encoding='utf-8-sig'保持兼容
最易被忽略的是空值处理:NaN 在 drop_duplicates() 中默认视为相等,但若某列混合了 NaN 和 None 或字符串 'NULL',就得先统一归一化,否则重复逻辑失效。动手前务必用 df.isna().sum() 和 df.apply(lambda x: x.unique()) 快速探查数据洁度。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










