如何高效合并两行Pandas数据为单一行(带重复列)用于时间序列建模
高效合并两行同列名DataFrame为一行的方案
针对你需要数百万次执行的场景,必须避免循环调用Pandas的concat(它的对象对齐、内存复制开销在批量场景下会被放大),推荐直接基于Numpy数组操作,或者批量生成所有滑动窗口样本,以下是具体实现:
1. 单组两行数据的快速合并
直接提取DataFrame的底层Numpy数组,通过reshape拉平,再生成带后缀的列名:
import pandas as pd import numpy as np # 示例两行数据 df = pd.DataFrame({'Column A': [1, 3], 'Column B': [2, 4]}) # 生成带_1/_2后缀的列名 new_columns = [f"{col}_{idx+1}" for idx in range(df.shape[0]) for col in df.columns] # 拉平数组并创建新DataFrame(reshape是视图操作,无内存复制) merged_df = pd.DataFrame(df.values.reshape(1, -1), columns=new_columns)
这个操作的核心是跳过Pandas的列对齐、对象合并逻辑,直接操作原始数据数组,内存占用仅为结果所需,速度比concat快10~100倍。
2. 批量生成时间序列滑动窗口样本(百万级场景首选)
如果是从长时序数据中批量生成所有窗口大小为2的样本,绝对不要循环处理每两行,用Numpy的滑动窗口技巧一次性生成所有样本:
# 假设原始时序数据是df_full(N行,M列) df_full = pd.DataFrame( {'Column A': range(1000000), 'Column B': range(1000000, 2000000)} ) # 提取底层数组 data = df_full.values # 生成滑动窗口(stride_trick不复制数据,内存高效) windows = np.lib.stride_tricks.sliding_window_view(data, window_shape=(2,), axis=0).squeeze(axis=1) # 批量拉平每个窗口为一行 flattened_data = windows.reshape(windows.shape[0], -1) # 生成统一列名 new_columns = [f"{col}_{idx+1}" for idx in range(2) for col in df_full.columns] # 转成最终DataFrame result_df = pd.DataFrame(flattened_data, columns=new_columns, index=df_full.index[1:])
为什么这个方案高效?
- 滑动窗口用
stride_tricks实现,不复制原始数据,仅创建视图,内存占用极低; - 所有操作都是Numpy的C级别的批量运算,避免了Python循环的开销;
- 一次性生成所有结果,跳过了数百万次Pandas对象的创建/合并开销。
关键优化点
- 避免在循环中创建Pandas对象:每创建一个DataFrame都会有内存和性能开销,批量处理才是核心;
- 优先用Numpy数组操作:Pandas的DataFrame底层是Numpy数组,直接操作数组能绕过很多Pandas的封装开销;
- 不要用
concat做批量合并:concat需要处理索引对齐、数据复制,单次操作开销不大,但数百万次循环会导致性能雪崩。
内容的提问来源于stack exchange,提问作者bktllr
相关产品推荐
相关产品推荐

