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()看看有多少重复,心里有数。

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