我的知识记录

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 这种激进模式。

Python Excel数据去重 pandas drop_duplicates

标签:

更新时间:2026-09-15 09:10:15

上一篇:Python Excel删除空行空列:清理脏数据一键搞定

下一篇:Python Excel日期格式化:datetime写进xlsx并显示成yyyy-mm-dd