如何使用滑动窗口按行(axis=1)拼接Pandas DataFrame数据?
如何按行以滑动窗口方式拼接Pandas数据?
给定如下测试数据:
import pandas as pd test = { 't':[0,1,2,3,4,5], 'A':[1,1,1,2,2,2], 'B':[9,9,9,9,8,8], 'C':[1,2,3,4,5,6] } df = pd.DataFrame(test)
你尝试用循环拼接的方式实现滑动窗口横向拼接,但得到错误结果。可以通过移位拼接的方式实现预期的滑动窗口横向拼接效果,以下是正确实现:
正确实现代码
window_size = 2 # 生成窗口内后续行的非t列数据,添加后缀区分窗口位置 shifted_cols = [] for win_step in range(window_size): # 移位win_step+1行,只保留A/B/C列,并重命名列 shifted = df.drop('t', axis=1).shift(-(win_step + 1)).add_suffix(f'_win{win_step+1}') shifted_cols.append(shifted) # 拼接原t列与所有窗口列 result_df = pd.concat([df[['t']]] + shifted_cols, axis=1) # 删除因移位产生的空值行(最后window_size行无对应窗口数据) result_df = result_df.dropna().reset_index(drop=True) print(result_df)
代码说明
- 移位处理:通过
shift(-n)获取当前行之后第n行的A/B/C列数据,用add_suffix给列名加上窗口标记(如A_win1),避免列名重复冲突。 - 横向拼接:将原数据的
t列与所有移位后的窗口列横向拼接,得到每行对应的滑动窗口数据。 - 清理空值:移位后最后
window_size行没有对应的后续窗口数据,会产生空值,直接删除即可。
原代码问题分析
- 索引计算错误:原代码中
row_idx+window_size会超出数据索引范围,导致拼接逻辑混乱。 - 列名无区分:直接拼接同名列会导致列名重复,无法区分窗口内的不同行数据。
- 循环范围不合理:原循环范围会遗漏部分有效行,导致结果行数不符合预期。
内容的提问来源于stack exchange,提问作者Jimmy Wang
相关产品推荐
相关产品推荐

