2014-03-26 45 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事後