多个月 Excel 客户名单合并去重:按手机号保留最新一条

2026-10-05 · 喵窝资源铺 · 本文脚本全部实跑验证

场景:8月、10月两份客户登记表,同一个手机号出现两次,要合并成一份"每人只留最新一条"的名单。听起来就是 drop_duplicates 一行的事,但我们实跑踩了三个会让结果悄悄错的坑——不报错、不崩溃,只是留下错的记录,你根本发现不了。

完整脚本(已实测)

"""合并多个月份的 Excel 后按关键列去重,保留最新一条。
用法:python dedup_keep_latest.py [输入目录] [输出xlsx] [关键列] [日期列]"""
import sys, glob, os
import pandas as pd

src  = sys.argv[1] if len(sys.argv) > 1 else "."
out  = sys.argv[2] if len(sys.argv) > 2 else "dedup.xlsx"
KEY  = sys.argv[3] if len(sys.argv) > 3 else "手机号"
DATE = sys.argv[4] if len(sys.argv) > 4 else "登记日期"

frames = []
for f in sorted(glob.glob(os.path.join(src, "*.xlsx"))):
    if os.path.basename(f) == os.path.basename(out):  # 防止把上次的输出又吃进来
        continue
    frames.append(pd.read_excel(f))

merged = pd.concat(frames, ignore_index=True)
n0 = len(merged)
merged[DATE] = pd.to_datetime(merged[DATE])          # 日期列转真日期,字符串排序才不出"2026-9-5"排错
merged = (merged.sort_values(DATE)
                .drop_duplicates(subset=[KEY], keep="last")   # 排序后留最后一条=最新
                .sort_values(DATE, kind="stable"))
merged.to_excel(out, index=False)
print(f"{len(frames)} 个文件共 {n0} 行, 按[{KEY}]去重保留[{DATE}]最新 -> {len(merged)} 行 -> {out}")

实测结果

两份测试表(8月3行 + 10月3行),张三在两份里都有:

2 个文件共 6 行, 按[手机号]去重保留[登记日期]最新 -> 4 行
13800000003 王五 2026-08-20  八月导入
13800000002 李四 2026-09-28  九月末更新
13800000001 张三 2026-10-01  十月更新-最新   ← 9月那条被正确丢弃
13800000004 赵六 2026-10-02

三个实跑踩出的坑(都是"悄悄错")

坑1:日期是字符串时,排序结果是错的

Excel 里"2026-9-30"读进来是字符串。字符串排序里 '2026-9-30' > '2026-10-01'(因为 '9' > '1'),于是 keep="last" 会留下 9月30日 那条、丢掉 10月1日 那条。我们实测:

sorted(['2026-10-1', '2026-9-5'])   # -> ['2026-10-1', '2026-9-5']  字符串眼里9排在10后面!
# 不加 to_datetime:留的是 2026-9-30 那条(错)
# 加 pd.to_datetime:留的是 2026-10-01 那条(对)

坑2:日期为空的行会抢走"最新"位置

pd.to_datetime 把空值变 NaT,NaT 在 sort_values 里排在最后,keep="last" 就留下了那条日期空白的记录。实测输出:日期为空时留: 日期空。如果"空日期"意味着"很老的数据",正确做法是先 dropna(subset=[DATE]) 或把 NaT 行排最前。

坑3:输出文件混进输入目录,下次跑会自我污染

如果输出也写到同一个目录,第二次运行会把上次的输出当输入再吃一遍。脚本里用 os.path.basename(f) == os.path.basename(out) 跳过——一行代码,省掉一次"数据翻倍"事故。

不想自己跑?

如果你手上有几份乱糟糟的名单/流水表需要清理合并,懒得配环境踩坑,我们提供代做服务:你把文件发到对话里,处理好的 Excel 直接回传给你,¥19.9/次。点这里下单 →(先在对话里说明需求再付款也可以喵)

虚拟物品交付后不退款;未收到或未达承诺免费补发/重做。