如何从pd.Series().rolling()对象中提取各窗口内的元素?
如何从Pandas Rolling对象中获取窗口列表
要从pd.Series(a).rolling(3)生成的对象中得到你预期的窗口列表,Pandas本身不会直接存储完整窗口集合,但可以通过以下两种方法实现:
方法1:利用apply捕获每个窗口
借助rolling.apply()自定义处理每个窗口,判断窗口是否填满,返回对应格式的列表:
import pandas as pd import numpy as np a = [1, 2, 3, 7, 9] roll_obj = pd.Series(a).rolling(3) def extract_window(window): # 窗口未填满时返回[nan] if window.isna().any(): return [np.nan] return window.tolist() window_list = roll_obj.apply(extract_window, raw=False).tolist() print(window_list) # 输出: [[nan], [nan], [1, 2, 3], [2, 3, 7], [3, 7, 9]]
这里raw=False确保每个窗口以Series形式传入函数,方便我们检测缺失值(对应窗口未填满的情况)。
方法2:手动生成窗口(性能更优)
如果处理大数据集,手动循环生成窗口可以避免apply的额外开销:
import numpy as np a = [1, 2, 3, 7, 9] window_size = 3 total_len = len(a) window_list = [] for idx in range(total_len): if idx < window_size - 1: window_list.append([np.nan]) else: # 截取对应区间的元素组成窗口 window_list.append(a[idx - window_size + 1 : idx + 1]) print(window_list) # 输出: [[nan], [nan], [1, 2, 3], [2, 3, 7], [3, 7, 9]]
需要注意的是,Pandas的Rolling对象是按需计算的,内部不会预先存储所有窗口的完整数据,所以需要通过上述方式主动提取。
内容的提问来源于stack exchange,提问作者Wenjie Yu
相关产品推荐
相关产品推荐

