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

