如何在Pandas的rolling groupby中使用随分组变化的窗口参数
按分组动态设置Rolling窗口的实现方案
针对你提供的月度数据DataFrame,由于同一id对应的window_in_months值固定,我们可以通过分组后自定义函数处理的方式,为每个分组设置专属的滚动窗口参数。
步骤1:预处理日期列
首先确保date列是datetime类型,保证时间排序的正确性:
import pandas as pd # 构造示例数据 data = { 'id': [1,1,2,2], 'date': ['2000-01-01','2000-02-01','2000-01-01','2000-02-01'], 'window_in_months': [3,3,12,12], 'value': [20,30,40,60] } df = pd.DataFrame(data) # 转换日期列为datetime类型 df['date'] = pd.to_datetime(df['date'])
步骤2:自定义分组滚动函数
编写函数,针对每个分组提取对应的窗口值,执行滚动计算(这里以均值为例,可替换为你需要的聚合函数如sum()、max()等):
def group_rolling_calc(group): # 获取当前分组的窗口大小(同一id的window_in_months值一致,取第一个即可) window_size = group['window_in_months'].iloc[0] # 先按日期排序,再执行滚动计算,min_periods与窗口大小保持一致 return group.sort_values('date')['value'].rolling( window=window_size, min_periods=window_size ).mean()
步骤3:应用分组计算并合并结果
通过groupby.apply将函数应用到每个分组,再将结果合并回原DataFrame:
# 应用分组滚动计算,group_keys=False避免保留分组键层级 df['rolling_result'] = df.groupby('id', group_keys=False).apply(group_rolling_calc).reset_index(level=0, drop=True)
结果说明
对于示例数据,由于每个分组的数据量都小于对应的窗口大小(id1窗口3只有2条数据,id2窗口12只有2条数据),所以rolling_result列的结果均为NaN,符合min_periods=window_size的要求——只有当窗口内数据量达标时才会输出计算值。
内容的提问来源于stack exchange,提问作者LattePrincess




