我的知识记录

Python Excel删除重复保留最新一条

按业务主键去重,但保留修改时间最新的那条记录,按时间列排序后再drop_duplicates,实现\"同客户只留最后更新\"的效果。

Python Excel删除重复保留最新

场景痛点

客户信息表同一个客户录了好几次,每次联系方式可能变了。直接按手机号去重会把最早的记录留下,最新的联系方式丢了。业务上要求"同客户只保留最后一次修改的那条"。正确做法是先按时间排序,再去重。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def dedup_keep_latest(input_file, output_file, key_col, time_col):
"""
按主键去重,保留时间最新的那条
key_col: 业务主键,如 手机号/客户ID
time_col: 时间列,如 最后修改时间
"""
df = pd.read_excel(input_file)

# 时间列转日期类型
df[time_col] = pd.to_datetime(df[time_col], errors="coerce")

# 先按时间升序排(旧的在前,新的在后)
df = df.sort_values(by=time_col, ascending=True)

# 按主键去重,keep="last" 保留最后一条,也就是时间最新的
df_clean = df.drop_duplicates(subset=[key_col], keep="last", ignore_index=True)

# 把时间列格式化回字符串,方便看
df_clean[time_col] = df_clean[time_col].dt.strftime("%Y-%m-%d %H:%M:%S")

df_clean.to_excel(output_file, index=False)
print(f"去重前{len(df)}行,去重后{len(df_clean)}行,删除{len(df)-len(df_clean)}条旧记录")

if __name__ == "__main__":
dedup_keep_latest(
"./客户跟进记录.xlsx",
"./客户最新档案.xlsx",
key_col="手机号",
time_col="跟进时间"
)

代码讲解

  • 关键思路:先排序再去重sort_values(by=时间, ascending=True) 让旧记录在前、新记录在后。
  • drop_duplicates(subset=[主键], keep="last") 每组重复保留最后一条,正好是时间最新的。
  • 时间列先 pd.to_datetime 转日期,否则按字符串排序会错(比如 "2026/9/1" 排在 "2026/10/1" 前面)。
  • errors="coerce" 把无法解析的时间变成NaT,不报错。

运行结果

生成 客户最新档案.xlsx,每个手机号只保留一条,且是跟进时间最晚的那次记录。

注意事项

  • 时间列格式不统一时,pd.to_datetime 可能解析失败,先 df[time_col].head() 看一眼实际值。
  • 如果时间完全相同,keep="last" 保留的是排序后的最后一条,行为不确定,建议业务上记录精确到秒。
  • 去重前先用 df[key].duplicated().sum() 看看有多少重复,心里有数。

Python Excel删除重复保留最新一条

标签:

更新时间:2026-09-15 09:03:20

上一篇:Python Excel按列排序 多列升降序

下一篇:Python Excel 读取合并单元格真实值方法