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
相关产品推荐
相关产品推荐

