You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效合并字典中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'])

进一步提升效率的技巧

  1. 提前统一数据类型
    合并前确保所有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)
  1. 压缩内存占用
    对重复值多的字符串列使用category类型,对数值列降级到合适类型(比如int64转int32、float64转float32),内存占用降低后,合并速度会显著提升。

  2. 批量分组合并
    如果直接合并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)
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:24:56