合并百个Pandas DataFrame时如何节省内存?
解决Pandas合并多表内存不足的方案
Pandas的pd.concat()本身没有inplace参数,无法实现原地合并来避免内存复制。不过可以通过以下几种内存友好的方式,跳过磁盘中转完成合并:
1. 逐个合并并即时释放内存
每次只加载一张表,合并到主DataFrame后立刻删除临时表,触发垃圾回收释放内存,避免同时持有大量临时DataFrame。
示例代码:
import pandas as pd import gc # 替换为你的表文件路径列表 file_list = ["table1.csv", "table2.csv", ..., "table100.csv"] # 初始化空的主DataFrame main_df = pd.DataFrame() for file in file_list: # 读取单张表(根据文件格式换read_excel/read_parquet等) temp_df = pd.read_csv(file) # 合并到主表 main_df = pd.concat([main_df, temp_df], ignore_index=True) # 删除临时表并释放内存 del temp_df gc.collect()
这种方式下,内存中始终只保留主DataFrame和当前正在处理的临时表,内存占用远低于一次性加载所有表。
2. 用Dask DataFrame分块处理
Dask是专门处理大数据量的并行计算库,它会分块加载数据,不会一次性把所有数据放入内存,最后可以转换为Pandas DataFrame(只要总数据量能装下内存)。
示例代码:
import dask.dataframe as dd # 读取所有文件(支持csv、excel等多种格式,自动分块) dask_df = dd.read_csv(file_list) # 对应格式用read_excel/read_parquet等 # 将Dask DataFrame转换为Pandas DataFrame main_df = dask_df.compute()
Dask会自动处理分块合并,全程内存占用可控,适合数据量接近内存上限的场景。
3. 优化数据类型减少内存占用
在读取单表时,通过指定更紧凑的数据类型,降低单个DataFrame的内存消耗,间接减少合并时的内存压力:
- 将字符串列转为
category类型(如果列的唯一值占比低) - 数值类型降级:比如
int64转int32/int8,float64转float32(需确保数据范围支持)
示例代码:
# 自定义数据类型映射 dtype_config = { "status": "category", "user_id": "int32", "amount": "float32" } temp_df = pd.read_csv(file, dtype=dtype_config)
内容的提问来源于stack exchange,提问作者LimaKilo
相关产品推荐
相关产品推荐

