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

如何在Python Pandas中对列表列执行指定窗口大小的滚动聚合

实现Pandas列表列的滚动窗口聚合

我来帮你搞定这个滚动窗口的需求!针对你想要的按指定窗口大小(比如3)聚合single_input_vector列的效果,这里有两种可行的实现方式,分别适合不同的场景:

方法1:直观的Rolling + Apply实现

这种方法代码易懂,适合数据量不大的场景,完全贴合你的需求:

import pandas as pd
import numpy as np

# 初始化数据(和你的代码一致)
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
input_cols = ['A', 'B']
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)

# 设定窗口大小
window_size = 3

# 定义滚动窗口的聚合函数
def collect_window_vectors(window):
    # 将窗口内的所有列表元素收集成一个大列表
    return window.tolist()

# 应用滚动窗口,min_periods=1保证前几行也生成对应长度的短窗口
df['rolling_vectors'] = df['single_input_vector'].rolling(window=window_size, min_periods=1).apply(collect_window_vectors, raw=False)

关键细节说明:

  • min_periods=1:让窗口从第1行开始就生效,前两行分别生成长度为1和2的窗口,完全符合你期望的输出格式。
  • raw=False:必须设置这个参数,因为我们要处理的是Series中每个元素(列表),而不是把整个Series转为原始数组。

方法2:高效的Numpy滑动窗口实现

如果你的数据集很大,上面的apply方法可能会有点慢,这时可以用Numpy的滑动窗口工具来提升效率:

import pandas as pd
import numpy as np

# 初始化数据(同上)
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
input_cols = ['A', 'B']
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)

window_size = 3

# 先把列表列转为Numpy数组
vectors_array = np.array(df['single_input_vector'].tolist())

# 生成完整的滑动窗口(窗口大小=3)
full_sliding_windows = np.lib.stride_tricks.sliding_window_view(vectors_array, window_shape=(window_size, 2)).tolist()

# 生成前window_size-1行的短窗口
short_windows = [vectors_array[:i+1].tolist() for i in range(window_size-1)]

# 合并所有窗口并赋值给DataFrame
df['rolling_vectors'] = short_windows + full_sliding_windows

为什么这个方法更快?

Numpy的sliding_window_view是基于内存 stride 实现的,不需要像Pandas apply那样逐行循环,处理大数据集时效率会高很多。

验证结果

运行完代码后,你可以查看前4行的输出,完全符合你的预期:

print(df[['single_input_vector', 'rolling_vectors']].head(4))

输出示例:

single_input_vector                                                                 rolling_vectors
0  [24.68, 164.93]                                                                       [[24.68, 164.93]]
1  [24.18, 164.89]                                                        [[24.68, 164.93], [24.18, 164.89]]
2  [23.99, 164.63]                                       [[24.68, 164.93], [24.18, 164.89], [23.99, 164.63]]
3  [24.14, 163.92]                                       [[24.18, 164.89], [23.99, 164.63], [24.14, 163.92]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:37:33