组和滚动窗口问题

时间:2019-11-11 09:07:11

标签: python pandas

有关: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,例如:

enter image description here

1 个答案:

答案 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