带有groupby的pandas数据框滚动窗口

Bri*_*ien 5 python dataframe pandas

我可以添加一个新列c,该列是最后两个值的和b,如下所示...

df['c'] = df.b.rolling(window = 2).sum().shift()

df
    a   b     c
0   1   3   NaN
1   1   0   NaN
2   0   6   3.0
3   1   0   6.0
4   0   0   6.0
5   1   7   0.0
6   0   0   7.0
7   0   7   7.0
8   1   4   7.0
9   1   2   11.0
Run Code Online (Sandbox Code Playgroud)

...但是,如果我想先分组a怎么办?例如,我可以这样做:

df['c'] = df.groupby(['a'])['b'].shift(1) + df.groupby(['a'])['b'].shift(2)

是否有一种更优雅的方法来汇总一组中的大量班次(1、2,... n)?

piR*_*red 5

f = lambda x: x.rolling(2).sum().shift()
df['c'] = df.groupby('a').b.apply(f)

df
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 注意:将rolling() 和shift() 方法组合在lambda 函数中(就像piRSquared 呈现的方式)是必要的:它会导致*both* 应用于该组(理想);在这种情况下会出现不正确的行为:`df['c'] = df.groupby('a').b.rolling(2).sum().shift()`,因为shift()操作发生在非分组上下文 (2认同)