必须设 dtype 和 usecols;否则默认推断类型、加载全部列、解析样式会导致内存暴涨2–5倍,极易触发 memoryerror 或卡死。

用 read_excel 读大文件前必须设 dtype 和 usecols
不加限制直接读百万行 Excel,pandas.read_excel 默认会推断每列类型、加载全部列、甚至尝试解析样式——这会让内存暴涨 2–5 倍,且极易触发 MemoryError 或卡死。真实场景里,90% 的列你根本不需要。
- 用
usecols显式指定要读的列名或列索引(如usecols=["id", "amount", "date"]),跳过备注、空列、冗余 ID 等 - 对已知格式的列强制设
dtype:字符串列写dtype={"name": "string"}(Python 3.11 + pandas ≥1.5 推荐用"string"而非str),数字列用"float32"或"int32"降精度 - 避免
converters:它在逐行回调中执行,比dtype慢 3–8 倍;清洗逻辑一律放到读入后做
合并前先用 pd.concat + ignore_index=True 拼接,别用循环 append
有人习惯写 df = pd.DataFrame() 然后循环 df = df.append(new_df),这在百万级数据下是灾难——每次 append 都复制整个 DataFrame,时间复杂度 O(n²),10 个文件就可能跑半小时。
- 把所有待合并的
DataFrame收集到一个列表:dfs = [read_one(file) for file in files] - 一次性拼接:
combined = pd.concat(dfs, ignore_index=True, copy=False)(copy=False在 pandas ≥1.5 中默认启用,显式写出更安心) - 如果内存吃紧,改用分批读取 + 分批
concat,但批次别小于 5 万行,太小反而增加调度开销
清洗空值和重复项时,优先用向量化操作,绕开 apply 和 iterrows
df.apply(lambda x: ...) 或 for idx, row in df.iterrows(): 在百万行上基本不可用——单核 CPU 跑满,耗时以分钟计,且无法利用 pandas 底层优化。
- 空值处理:用
df["col"].fillna("N/A")或df.dropna(subset=["key_col"]),别写自定义函数 - 去重:
df.drop_duplicates(subset=["id", "date"], keep="last")比先排序再groupby快得多,尤其当去重键少于总列数一半时 - 字符串清洗:用
str.replace、str.strip等原生方法,它们底层调用的是编译好的 C 代码;str.extract比正则re.search在 Series 上快 10 倍以上
导出结果前务必用 to_parquet 替代 to_excel
导出百万行到 Excel(.xlsx)本质是序列化成 ZIP+XML,CPU 和 I/O 压力极大,常卡住或生成几百 MB 的臃肿文件。而 to_parquet 是列式二进制格式,压缩率高、读写快、支持类型保留,且能被 Spark/Polars 等工具无缝读取。
- 写法:
combined.to_parquet("cleaned_data.parquet", engine="pyarrow", compression="snappy") - 若真需 Excel 输出,至少用
openpyxl引擎(比默认xlsxwriter支持更多格式),并关闭index=False和freeze_panes等非必要功能 - 注意:Parquet 文件不能像 Excel 那样“双击打开”,但它才是生产环境真正可复用的数据交付格式
read_excel 的第一个参数开始,就要想清楚这一列要不要、是什么类型、会不会爆炸。Excel 是给人看的,不是给机器算的。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











