最推荐用 pandas.concat 合并多个 excelfile 的 sheet 数据,先统一结构再写入;需显式指定 sheet_name、标准化列名、添加来源标识,并用 excelwriter 多 sheet 输出。

用 pandas.concat 合并多个 ExcelFile 的 sheet 数据
直接读取多个 Excel 文件的同名或不同名 sheet,再拼接成一个 DataFrame,是最常见也最可控的做法。关键不是“合并文件”,而是“合并数据”——先统一结构,再写入新文件。
- 每个
pd.read_excel()调用最好显式指定sheet_name(比如0、"Sheet1"或None),避免默认只读第一个 sheet 或意外跳过空表 - 如果各文件字段不一致,
concat会自动对齐列,缺失值填NaN;但列名大小写、空格、前后缀不一致会导致重复列,建议提前用.columns.str.strip().str.lower()标准化 - 不要用
append(已弃用)或循环pd.concat([df1, df2, df3])多次调用,应把所有 DataFrame 收集到列表里,一次性pd.concat(dfs, ignore_index=True)
保留原始 sheet 名称并添加来源标识
很多场景需要知道某行数据来自哪个文件、哪个 sheet。靠文件名或 sheet 名打标签,比单纯堆叠更实用。
- 读取时用
pd.read_excel(..., sheet_name=None)得到dict:键是 sheet 名,值是 DataFrame;再对每个df添加列如source_file和source_sheet - 示例:
dfs = []<br>for f in ["a.xlsx", "b.xlsx"]:<br> exc = pd.ExcelFile(f)<br> for sheet in exc.sheet_names:<br> df = exc.parse(sheet)<br> df["source_file"] = f<br> df["source_sheet"] = sheet<br> dfs.append(df)
- 注意:如果某个文件里有多个 sheet,而你只想要其中一部分,别用
sheet_name=None全读——浪费内存;改用sheet_name=["Sales", "Orders"]
写入单个 Excel 文件时控制多 sheet 输出
to_excel 默认只写一个 sheet,要分 sheet 写入,必须用 ExcelWriter 上下文管理器,且每个 df.to_excel(writer, sheet_name=...) 必须在同一个 writer 实例中完成。
- 错误做法:
df1.to_excel("out.xlsx", sheet_name="A"); df2.to_excel("out.xlsx", sheet_name="B")—— 第二步会覆盖第一步 - 正确写法:
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:<br> df1.to_excel(writer, sheet_name="Raw_Data", index=False)<br> summary_df.to_excel(writer, sheet_name="Summary", index=False) - 引擎选
openpyxl(支持 .xlsx 写入多 sheet),别用默认xlsxwriter(不支持追加已有文件,也不支持读取) - 如果目标文件已存在,
ExcelWriter默认会清空它;想追加内容?得先用openpyxl.load_workbook()手动打开、复制旧 sheet,再写新 sheet——这已超出pandas能力范围
大文件合并时内存和性能怎么扛住
几十 MB 的 Excel 合并时卡死,往往不是代码逻辑错,而是没做分块或类型优化。
- 读取时加
dtype参数,比如dtype={"ID": "string", "Amount": "float32"},避免 pandas 自动推断成object或float64浪费内存 - 不用
read_excel读整个 sheet,可配合usecols只读必要列,nrows限制行数做调试,skiprows/skipfooter跳过报表头尾 - 合并后写入前,用
df.memory_usage(deep=True).sum()看实际占用;超 500MB 就该考虑分批写入或换用pyarrow+parquet中转
真正麻烦的是混合格式:日期识别错、数字存成文本、合并单元格残留——这些不会报错,但会让后续分析跑偏。别依赖 Excel 自动格式,读进来立刻用 pd.to_datetime、pd.to_numeric(..., errors="coerce") 显式转换。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











