我希望在pd.rolling_mean
操作中使用groupby
。我想在每个组中包含同一组中之前 elemnets的滚动平均值。这是一个例子:
id val
0 1
0 2
0 3
1 4
1 5
2 6
按id
分组,这应该转换为:
id val
0 nan
0 1
0 1.5
1 nan
1 4
2 nan
答案 0 :(得分:3)
我认为您需要groupby
shift
和rolling
,窗口大小可以设置为标量:
df['val']=df.groupby('id')['val'].apply(lambda x: x.shift().rolling(2, min_periods=1).mean())
print (df)
id val
0 0 NaN
1 0 1.0
2 0 1.5
3 1 NaN
4 1 4.0
5 2 NaN
感谢3novak
发表评论 - 您可以按照组的最大长度设置窗口大小:
f = lambda x: x.shift().rolling(df['id'].value_counts().iloc[0], min_periods=1).mean()
df['val'] = df.groupby('id')['val'].apply(f)
print (df)
id val
0 0 NaN
1 0 1.0
2 0 1.5
3 1 NaN
4 1 4.0
5 2 NaN
答案 1 :(得分:3)
我相信你想要pd.Series.expanding
df.groupby('id').val.apply(lambda x: x.expanding().mean().shift())
0 NaN
1 1.0
2 1.5
3 NaN
4 4.0
5 NaN
Name: val, dtype: float64