2026-10-28 · Python / Excel / 自动化 / pandas

Python 批量整理 Excel:合并、去重、清洗,一次写完反复用

如果你每个月都要花几小时整理同样的表格——合并多个 Excel、去重、把日期金额格式统一——那这件事只值得手工做一次,剩下都应该交给脚本。

这篇文章把我给客户做数据整理时最常用的一套模板写出来,可以直接复用。

环境准备

pip install pandas openpyxl

只需要这两个库:pandas 处理数据,openpyxl 读写 .xlsx。

场景:多份表格合并 + 清洗

假设有个文件夹 原始表格/,里面有 1 月到 12 月的 Excel,每个文件结构相同,需要:

  1. 全部合并成一张表
  2. 删除完全重复的行
  3. 手机号去掉空格和横杠
  4. 日期统一成 YYYY-MM-DD
  5. 金额去掉 ¥ 和逗号,转成数字
  6. 导出成新的 Excel
import glob
import pandas as pd

# 1. 读取文件夹下所有 Excel 并合并
files = glob.glob("原始表格/*.xlsx")
df = pd.concat([pd.read_excel(f) for f in files], ignore_index=True)

# 2. 删除完全重复行
df = df.drop_duplicates()

# 3. 清洗文本:去掉首尾空格
for col in df.select_dtypes(include="object").columns:
    df[col] = df[col].astype(str).str.strip()

# 4. 手机号只保留数字
if "手机号" in df.columns:
    df["手机号"] = df["手机号"].str.replace(r"[^\d]", "", regex=True)

# 5. 日期统一
if "下单日期" in df.columns:
    df["下单日期"] = pd.to_datetime(df["下单日期"], errors="coerce").dt.strftime("%Y-%m-%d")

# 6. 金额转数字
if "金额" in df.columns:
    df["金额"] = (
        df["金额"].astype(str)
        .str.replace(r"[^\d.]", "", regex=True)
        .replace("", "0")
        .astype(float)
    )

# 7. 导出
df.to_excel("清洗结果.xlsx", index=False)
print(f"完成:{len(df)} 行 -> 清洗结果.xlsx")

把文件放好,执行 python clean.py,几秒钟出结果。以后每个月只需要重复最后一步。

常见坑

1. 日期解析失败 不同来源的日期格式五花八门(2026/9/3、2026.09.03、2026-9-3)。pd.to_datetime(..., errors="coerce") 解析不了的会变成空值,建议清洗后统计一下空值数量,确认没有静默丢失。

2. 金额带单位 ¥ 1,299元 这种要先去掉非数字字符再转 float,否则 astype(float) 直接报错。

3. 合并前列名不一致 多个文件列名有空格或顺序不同,合并前先统一列名:

df.columns = [c.strip() for c in df.columns]

4. 大文件内存 几十万行以内没问题;上百万行建议分块读:

for chunk in pd.read_excel("大文件.xlsx", chunksize=50000):
    ...

什么时候值得写脚本

  • 同一份整理工作每月/每周重复
  • 表格规则固定(哪怕复杂)
  • 数据量手工处理要超过 10 分钟

反过来,如果只做一次、规则又经常变,手工更快,别为了自动化而自动化。

小结

这类工作的价值不在代码本身,而在流程固化:写一次,以后每月省下几小时,还不会出错。有类似表格整理需求,也可以找我做定制脚本。