如何高效合并字典中3750个Pandas DataFrame为大型数据集
高效合并多个Pandas DataFrame的方案
核心误区纠正
你之前的代码使用axis=1做列方向合并,这会把所有DataFrame的列横向拼接,导致总列数暴增(3750个DataFrame的列数总和),这不仅不符合你“总计180-190万条记录”的需求,更是效率低下的关键原因。如果你的所有DataFrame列结构完全一致(列名、数据类型匹配),必须使用**axis=0进行行方向合并**。
基础优化:优化Pandas concat用法
如果所有DataFrame列结构一致,直接用以下代码即可,这是Pandas中最直接的高效合并方式:
import pandas as pd # 行方向合并,忽略原索引,生成连续新索引 df_merged = pd.concat(pdf_dict.values(), axis=0, ignore_index=True) # 若需保留每条记录对应的原字典键(即原DataFrame标识),添加keys参数 df_merged = pd.concat(pdf_dict.values(), axis=0, keys=pdf_dict.keys(), names=['source_df', 'original_index'])
进一步提升效率的技巧
- 提前统一数据类型
合并前确保所有DataFrame的对应列数据类型一致,避免concat过程中自动类型转换的额外开销。示例如下:
# 假设所有DataFrame的列类型统一为以下规则 dtype_spec = {'col1': 'category', 'col2': 'object', 'col3': 'int32'} for key in pdf_dict: pdf_dict[key] = pdf_dict[key].astype(dtype_spec)
压缩内存占用
对重复值多的字符串列使用category类型,对数值列降级到合适类型(比如int64转int32、float64转float32),内存占用降低后,合并速度会显著提升。批量分组合并
如果直接合并3750个DataFrame仍较慢,可将列表分块,先合并小批次,再合并批次结果:
import itertools def chunked(iterable, n): it = iter(iterable) while True: chunk = tuple(itertools.islice(it, n)) if not chunk: return yield chunk # 每500个DataFrame为一批进行合并 chunks = chunked(pdf_dict.values(), 500) merged_chunks = [] for chunk in chunks: merged_chunks.append(pd.concat(chunk, axis=0, ignore_index=True)) df_merged = pd.concat(merged_chunks, axis=0, ignore_index=True)
- Dask并行合并(超大数据量场景)
如果Pandas单进程处理吃力,可使用Dask DataFrame利用多CPU核心并行合并:
import dask.dataframe as dd # 按CPU核心数设置分区数 ddf = dd.from_pandas(pd.concat(pdf_dict.values(), axis=0, ignore_index=True), npartitions=4) # 执行计算得到最终的Pandas DataFrame df_merged = ddf.compute()
结果验证
合并后可通过以下代码确认总记录数是否符合预期:
print(f"合并后总记录数: {len(df_merged)}")
内容的提问来源于stack exchange,提问作者Ridhi
相关产品推荐
相关产品推荐

