drop_duplicates默认比较所有列,易误删;应显式指定subset、keep参数,避免inplace=True,先用duplicated()探查重复,注意空值、字符串清洗、时间/数值类型统一及业务逻辑定义。

drop_duplicates 默认只看全部列,容易误删
很多人调用 df.drop_duplicates() 后发现数据变少了,但检查几行又没明显重复——问题出在它默认比较**所有列**。只要任意两行在全部列上完全一致,就留第一行、删后面所有。
- 如果你只关心某几列是否重复(比如只看
"user_id"和"date"),必须显式传subset=["user_id", "date"] - 不指定
keep时默认是keep="first",但若想保留最后一次出现的,得写keep="last" - 空值(
NaN)在 pandas 里彼此不相等,所以含NaN的行通常不会被识别为重复,除非整行其他值都一样且NaN位置也一致
inplace=True 不是万能解,多数时候该用赋值
inplace=True 看起来省事,但会破坏链式操作,也容易掩盖引用问题。尤其在函数内或 pipeline 中,它让调试变困难。
- 推荐写法:
df = df.drop_duplicates(subset=["id"]),清晰表明“我拿到了新 DataFrame” -
inplace=True在某些 pandas 版本中对视图(view)会报SettingWithCopyWarning,甚至静默失败 - 如果原 DataFrame 很大,直接赋值不会额外拷贝数据(pandas 内部做了优化),性能和
inplace差不多
删除重复前先确认哪些行真重复了
盲目删可能丢数据。用 duplicated() 先探路,比直接删更稳妥。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 查重复行索引:
df[df.duplicated(subset=["email"], keep=False)],keep=False让所有重复行都标出来 - 统计每组重复次数:
df.groupby(["category", "status"]).size().sort_values(ascending=False) - 注意:
duplicated()返回布尔 Series,别直接喂给drop_duplicates()——它俩接口不兼容
字符串列有空格或大小写差异?drop_duplicates 不会自动处理
drop_duplicates 是严格字面匹配,"Alice " 和 "Alice" 被视为不同,"alice" 和 "Alice" 也是。
- 清洗再去重才是常规流程:
df["name"] = df["name"].str.strip().str.lower(),然后再drop_duplicates(subset=["name"]) - 时间列如果混着字符串和 datetime 类型,也会导致“看起来一样却不算重复”,先统一转成
pd.to_datetime() - 数值列如果有浮点误差(如
0.1 + 0.2 != 0.3),考虑先四舍五入或转成整数再比较
事情说清了就结束。真正麻烦的从来不是怎么删,而是删之前没想明白:你定义的“重复”,到底依赖哪几列、容不容错、空值算不算、大小写敏感吗——这些得自己定,pandas 只负责执行。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










