Python Excel数据去重 pandas drop_duplicates
详解pandas drop_duplicates参数,按整行去重、按指定列去重、保留第一条/最后一条、多列联合去重,一次性清理Excel里的重复数据。
场景痛点
从系统导出的Excel常常有重复行:同一条订单导了两次、同一个客户录了两遍。手动高亮重复值再删除,慢且容易误删。pandas的 drop_duplicates 一行代码搞定,还能精确控制按哪些列判重、保留哪一条。
用到的库
pip install pandas openpyxl
完整代码
import pandas as pd
def deduplicate(input_file, output_file, subset=None, keep="first"):
"""
对Excel去重
subset: 用来判断重复的列名列表,None表示整行完全相同才算重复
keep: 'first'保留第一条, 'last'保留最后一条, False全部删掉
"""
df = pd.read_excel(input_file)
before = len(df)
# 先去除字符串两端空格,避免"张三"和" 张三"被当成不同人
for col in df.select_dtypes(include="object").columns:
df[col] = df[col].astype(str).str.strip()
# 去重
df_clean = df.drop_duplicates(subset=subset, keep=keep, ignore_index=True)
after = len(df_clean)
df_clean.to_excel(output_file, index=False)
print(f"去重前{before}行,去重后{after}行,删除重复{before - after}行")
def find_duplicates(input_file, subset=None):
"""只找出重复行,不删除,先看清楚再处理"""
df = pd.read_excel(input_file)
dup = df[df.duplicated(subset=subset, keep=False)]
print(f"发现重复行{len(dup)}条")
print(dup)
if __name__ == "__main__":
# 按"手机号"一列去重,保留第一条
deduplicate("./客户表.xlsx", "./客户表_去重.xlsx", subset=["手机号"], keep="first")
# 整行完全相同才算重复
deduplicate("./订单表.xlsx", "./订单表_去重.xlsx")
# 只查不删
find_duplicates("./客户表.xlsx", subset=["手机号"])
代码讲解
subset=["手机号"]表示只要手机号相同就判为重复,其他列不同也会被去重;不传subset则要求整行所有列都一样才算重复。keep="first"保留第一次出现的行;keep="last"保留最后一次;keep=False把所有重复行都删掉(只保留完全没重复过的)。- 去重前对文本列做
str.strip()去掉首尾空格,这是最常见的去重失效原因。 df.duplicated(keep=False)配合布尔索引先把所有重复行筛出来肉眼检查,更安全。
运行结果
生成去重后的新Excel,控制台打印删除了多少行。find_duplicates 会直接在终端打印所有重复行,方便人工核对。
注意事项
drop_duplicates不会修改原文件,结果写入新文件,原数据保留。- 日期列、数字列如果有浮点误差,建议先
round()或转成字符串再判重。 - 去重前建议先备份原文件,尤其是
keep=False这种激进模式。

更新时间:2026-09-15 09:10:15
上一篇:Python Excel删除空行空列:清理脏数据一键搞定