有关:pandas dataframe rolling window with groupby
我有一些DataFrame
:
df = pd.DataFrame({'type':[0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1],
'rank':[0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4],
'score':[5,8,10,12,4,9,13,23,42,4,9,10,8,12,48,9]})
我想添加一个新列,其中包括每4个scores
中每个type
的{{1}}的滚动平均值。
类似这样的东西非常接近我想要的:
ranks
但是我想从每个f = lambda x: x.rolling(4, min_periods=4).mean()
df['rolling'] = df.groupby('type')['score'].apply(f)
的第一个rank
开始取平均值。最后3个type
应该返回NaN,例如:
答案 0 :(得分:2)
如果需要按组转移,请向mean
中添加Series.shift
:
f = lambda x: x.rolling(4, min_periods=4).mean().shift(-3)
df['rolling'] = df.groupby('type')['score'].apply(f)
如果希望将shift
的所有值加到组外,那应该是什么?
df['rolling'] = (df.groupby('type')
.score.rolling(4, min_periods=4)
.mean()
.shift(-3)
.reset_index(level=0, drop=True))
print (df)
type rank score rolling
0 0 0 5 8.75
1 0 1 8 8.50
2 0 2 10 8.75
3 0 3 12 9.50
4 0 4 4 12.25
5 0 5 9 21.75
6 0 6 13 20.50
7 0 7 23 19.50
8 0 8 42 NaN
9 0 9 4 NaN
10 0 10 9 NaN
11 1 0 10 19.50
12 1 1 8 19.25
13 1 2 12 NaN
14 1 3 48 NaN
15 1 4 9 NaN