2014-03-26 193 views
25

我想累积和列添加到我的熊猫数据帧,这样:熊猫GROUPBY累积和

name | day  | no 
-----|-----------|---- 
Jack | Monday | 10 
Jack | Tuesday | 20 
Jack | Tuesday | 10 
Jack | Wednesday | 50 
Jill | Monday | 40 
Jill | Wednesday | 110 

变为:

Jack | Monday  | 10 | 10 
Jack | Tuesday | 30 | 40 
Jack | Wednesday | 50 | 100 
Jill | Monday  | 40 | 40 
Jill | Wednesday | 110 | 150 

我试过的df.groupbydf.agg(lambda x: cumsum(x))各种连击无济于事。提前致谢!

回答

26

这应该这样做,需要groupby()两次。

In [52]: 

print df 
    name  day no 
0 Jack  Monday 10 
1 Jack Tuesday 20 
2 Jack Tuesday 10 
3 Jack Wednesday 50 
4 Jill  Monday 40 
5 Jill Wednesday 110 
In [53]: 

print df.groupby(by=['name','day']).sum().groupby(level=[0]).cumsum() 
       no 
name day   
Jack Monday  10 
    Tuesday  40 
    Wednesday 90 
Jill Monday  40 
    Wednesday 150 

注意,所产生的DataFrameMultiIndex

+1

感谢您的回答。我确实有一些疑问:1.你能解释'level = [0]'是什么意思吗? 2.另外,正如你所看到的,你之前在你的数据框中有行号,并且一旦你完成累计和,这些行号就会消失。有没有办法让他们回来? – user3694373

+1

1),索引号必须去,因为cumsums来自多行,如第二个数字40,是10 + 20 + 10,它应该得到哪个索引值? 1,2或3?所以,让我们继续使用'name'和'day'作为'multiIndex',这更好理解(如果需要,'reset_index()'获得'int'索引)。 2),'level = [0]'表示'groupby'是由'MultiIndex'的第一层操作的,即'name'列。 –

+0

谢谢CT。我后来明白了这一点,并尝试使用reset_index()来解决我的问题。感谢您的详细解释! – user3694373

22

这个作品在大熊猫0.16.2

In[23]: print df 
     name   day no 
0  Jack  Monday 10 
1  Jack  Tuesday 20 
2  Jack  Tuesday 10 
3  Jack Wednesday 50 
4  Jill  Monday 40 
5  Jill Wednesday 110 
In[24]: df['no_cumulative'] = df.groupby(['name'])['no'].apply(lambda x: x.cumsum()) 
In[25]: print df 
     name   day no no_cumulative 
0  Jack  Monday 10    10 
1  Jack  Tuesday 20    30 
2  Jack  Tuesday 10    40 
3  Jack Wednesday 50    90 
4  Jill  Monday 40    40 
5  Jill Wednesday 110   150 
+0

显示如何将其添加回df是非常有用的。我尝试过使用变换,但是与cumsum()并不能很好地配合。 – zerovector

2

而不是df.groupby(by=['name','day']).sum().groupby(level=[0]).cumsum() (见上文),你也可以做一个df.set_index(['name', 'day']).groupby(level=0, as_index=False).cumsum()

  • df.groupby(by=['name','day']).sum()实际上只是移动两列,将一个多指标
  • as_index=False意味着你不需要调用reset_index事后