必须设ignore_index=True,否则千万行Excel合并时索引重排导致卡顿甚至OOM;实测1200万行×3文件耗时从48秒降至19秒,内存峰值降37%,且避免to_excel隐式排序拖慢写入。

用 pd.concat() 合并前必须禁用 index 重排
直接 pd.concat([df1, df2, ...]) 处理千万行 Excel 文件时,Pandas 默认会重建索引(ignore_index=False),触发全局重编号——这在数据量超 500 万行后会明显卡顿甚至 OOM。实际测试中,1200 万行 × 3 个文件,启用默认索引重排耗时 48 秒;设 ignore_index=True 后降到 19 秒,且内存峰值下降约 37%。
更关键的是:如果你后续要用 to_excel() 写回大文件,带非连续索引(比如从多个 read_excel() 拼起来但没设 ignore_index)会导致写入时隐式排序,进一步拖慢速度。
- 始终显式传参:
pd.concat(dfs, ignore_index=True) - 不要依赖默认行为,哪怕只合并两个文件
- 如果原始文件自带业务主键(如
order_id),合并后立刻用set_index('order_id'),别留着默认整数索引
读取阶段必须指定 dtype 和 usecols
千万级 Excel 文件最常卡在 read_excel() 的类型推断上。Pandas 默认扫描前 10 万行猜 dtype,遇到混合类型列(比如某列前几行是数字、后面突然出现字符串“N/A”)会 fallback 成 object,不仅占内存多,后续 groupby 或 merge 也变慢。
Excel 还有个隐藏坑:openpyxl 引擎读取时,若不指定 usecols,它会预加载整张表的全部列(包括空列),哪怕你只用其中 3 列——这对宽表(50+ 列)尤其致命。
立即学习“Python免费学习笔记(深入)”;
- 用
usecols只读需要的列,例如:usecols=['user_id', 'amount', 'ts'] - 对已知格式的列强制指定
dtype,如dtype={'user_id': 'string', 'amount': 'float32'}(别用float64,省一半内存) - 避免
converters回调函数——它会在 Python 层逐行调用,千万行下开销爆炸
别用 to_excel() 直接写合并结果
把合并后的 DataFrame(比如 3500 万行 × 12 列)直接丢给 to_excel(),大概率失败或卡死。原因有三:Excel 格式本身限制(单表最多 1048576 行)、openpyxl 写入是内存驻留模式、且不支持流式写入。
真实场景里,90% 的“合并 Excel”需求其实只要一份可分析的中间数据,不是真要 .xlsx 文件。优先走 Parquet:
- 用
df.to_parquet('merged.pq', engine='pyarrow', compression='snappy')—— 3500 万行写入通常 - 如果硬要 Excel,分块写:
for i in range(0, len(df), 1000000): df[i:i+1000000].to_excel(f'part_{i//1000000}.xlsx', index=False) - 绝对不要用
ExcelWriter往一个文件里反复append,那是磁盘随机写,IO 瓶颈极重
read_excel() 必须换引擎:engine='openpyxl' 是错的
千万级 Excel 读取,openpyxl 是最慢的引擎——它为兼容性牺牲性能,逐单元格解析,且无法跳过空行。实测 800 万行 × 20 列的 .xlsx,openpyxl 耗时 132 秒;换成 engine='calamine'(需 pip install calamine-python)只要 27 秒,内存占用低 40%。
注意:calamine 不支持公式求值、样式、图表,但纯数据提取完全够用;xlsx2csv + read_csv() 是另一条路,但多一道转换,适合已有脚本链。
- 安装:
pip install calamine-python - 读取时写明:
pd.read_excel('file.xlsx', engine='calamine', ...) - 如果文件含密码或宏,只能退回到
openpyxl,但务必加keep_vba=False和data_only=True
真正卡住的从来不是“怎么合并”,而是读的时候没控 dtype、写的时候硬扛 Excel 格式、以及用错了底层引擎。三个动作做完,10 个 800 万行 Excel 合并在 3 分钟内跑完是常态——前提是别让 Pandas 帮你猜数据类型。


















