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

如何高效合并两行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:22:29