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

Pandas纵向拼接千个DataFrame速度极慢,求加速优化方案

加速Pandas纵向拼接大量小DataFrame的方法

1. 提前统一所有DataFrame的列结构

你的小DataFrame存在列不一致的情况(比如df1无d列,df2有),pd.concat在拼接时会动态处理列对齐,这是耗时的主要原因之一。可以先统一所有列:

import pandas as pd
import numpy as np

# 第一步:收集所有可能的列名
all_columns = set()
for df in frame_list:
    all_columns.update(df.columns)
all_columns = list(all_columns)

# 第二步:给每个小DataFrame补全缺失列并统一列顺序
for idx in range(len(frame_list)):
    df = frame_list[idx]
    missing_cols = [col for col in all_columns if col not in df.columns]
    # 补全缺失列,用NaN填充
    df = df.assign(**{col: np.nan for col in missing_cols})
    # 统一列顺序,避免拼接时重新排序
    frame_list[idx] = df[all_columns]

# 第三步:拼接
final_frame = pd.concat(frame_list, axis=0, sort=False)

2. 跳过循环创建小DataFrame,直接收集行数据

循环创建1000个独立的DataFrame会产生大量对象初始化开销,改为直接收集每行数据(字典或列表),最后一次性生成大DataFrame:

data_rows = []
indices = []

# 替换原来创建df1、df2的循环,直接收集数据
# 示例:对应原来的df1
data_rows.append({'a':0,'b':1,'c':1})
indices.append('z')
# 对应原来的df2
data_rows.append({'a':0,'b':1,'c':1,'d':2})
indices.append('y')

# 一次性生成大DataFrame
final_frame = pd.DataFrame(data_rows, index=indices)

这种方法能彻底消除小DataFrame的创建开销,是提速最明显的方案。

3. 优化pd.concat的参数

确保关闭不必要的排序操作(旧版本Pandas默认sort=True,会额外消耗时间):

final_frame = pd.concat(frame_list, axis=0, sort=False)

4. 大数据量场景用Dask并行拼接

如果总数据量超出内存,可使用Dask框架并行处理拼接任务:

import dask.dataframe as dd

# 将第一个DataFrame转为Dask DataFrame
dask_df = dd.from_pandas(frame_list[0], npartitions=4)
# 逐个拼接剩余的DataFrame
for df in frame_list[1:]:
    dask_df = dd.concat([dask_df, dd.from_pandas(df, npartitions=1)])
# 计算得到最终的Pandas DataFrame
final_frame = dask_df.compute()

内容的提问来源于stack exchange,提问作者FelixSD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:10:27