2016-11-20 91 views
2

,我可以添加一个新列c是如下图所示的b最后两个值的总和......大熊猫据帧滚动窗口与GROUPBY

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 

...但是,如果我想什么首先由a组?例如。我可以这样做:

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

是否有一组总结了大量班次(1,2,... n)的更优雅的方式?

回答

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

df 

enter image description here

+0

警告:结合轧制()和移位()中的λ函数的方法(只是顺便piRSquared呈现它)是必要的:它使*都*将被施加到该组(期望的); ()操作出现在这种情况下,会出现不正确的行为:'df ['c'] = df.groupby('a')。b.rolling(2).sum()。shift非分组情况 –

+0

@BrianBien感谢您指出了这一点。我会研究它。 – piRSquared

+0

对不起,我希望我没有添加混淆:我的意思是说*你的方法是正确的*而另一种方法似乎是句法偏好,会导致意想不到的行为 –