2017-01-23 56 views
4

我花了幾個小時試圖在熊貓數據框上做一個「累計分組總和」。我已經看了所有的計算器答案和令人驚訝的沒有人可以解決我的(非常初級的)問題:Pandas group by cumsum keep colums

我有一個數據幀:

df1 Out[8]: Name Date Amount 0 Jack 2016-01-31 10 1 Jack 2016-02-29 5 2 Jack 2016-02-29 8 3 Jill 2016-01-31 10 4 Jill 2016-02-29 5

我想

  1. ['姓名','日期']和
  2. cumsum'金額'。
  3. 就是這樣。

因此所需的輸出是:

df1 Out[10]: Name Date Cumsum 0 Jack 2016-01-31 10 1 Jack 2016-02-29 23 2 Jill 2016-01-31 10 3 Jill 2016-02-29 15

編輯:我簡化了問題。目前的答案我仍然無法獲得正確的「跑步」cumsum。仔細觀察,我想看看累計總和「10,23,10,15」。換句話說,我希望在每一個連續的日期都能看到一個人的累計總和。注意:如果同一人在同一個日期有兩個條目,我想將它們相加,然後將它們添加到正在運行的cumsum中,然後纔打印總和。

我明白任何建議和/或幫助。

回答

3

您需要分配輸出到新列,然後通過drop刪除Amount柱:

df1['Cumsum'] = df1.groupby(by=['Name','Date'])['Amount'].cumsum() 
df1 = df1.drop('Amount', axis=1) 
print (df1) 
    Name  Date Cumsum 
0 Jack 2016-01-31  10 
1 Jack 2016-02-29  5 
2 Jack 2016-02-29  13 
3 Jill 2016-01-31  10 
4 Jill 2016-02-29  5 

assign另一種解決方案:

df1 = df1.assign(Cumsum=df1.groupby(by=['Name','Date'])['Amount'].cumsum()) 
     .drop('Amount', axis=1) 
print (df1) 
    Name  Date Cumsum 
0 Jack 2016-01-31  10 
1 Jack 2016-02-29  5 
2 Jack 2016-02-29  13 
3 Jill 2016-01-31  10 
4 Jill 2016-02-29  5 

編輯的評論:

首先groupbyNameDate和聚合sum,然後groupby,levelName和總計cumsum

df = df1.groupby(by=['Name','Date'])['Amount'].sum() 
     .groupby(level='Name').cumsum().reset_index(name='Cumsum') 
print (df) 
    Name  Date Cumsum 
0 Jack 2016-01-31  10 
1 Jack 2016-02-29  23 
2 Jill 2016-01-31  10 
3 Jill 2016-02-29  15 
+0

感謝您的答覆提供了相同的答案,但是第二組應該一概而論傑克的多個2016年2月29日金額在一起。所以Cumsum只能有四行寫着 「10,23,10,15」。我會嘗試與你仍然提供了什麼工作,謝謝。 – gmarais

+0

請檢查編輯答案。 – jezrael

+0

天才!完美的感謝 – gmarais

4

先設置索引,然後設置groupby。

df.set_index(['Name', 'Date']).groupby(level=[0, 1]).Amount.cumsum().reset_index() 

enter image description here


的OP改變了他們的問題之後,現在這是正確的答案。

df1.groupby(
    ['Name','Date'] 
)Amount.sum().groupby(
    level='Name' 
).cumsum() 

這是jezrael

+0

感謝您的答覆。根據我的編輯,您的解決方案不會提供所需的輸出,但我相信您已提供了良好的方向。謝謝 – gmarais

+0

誰給了我一個反對票,請在考慮答案後,OP重新考慮改變他們的問題。我不想出現複製jezrael的答案,所以我只是提到它。 – piRSquared

+0

您好piRSquared,我downvoted因爲原始的期望輸出(即使在編輯之前)沒有實現你的代碼 - 所以至少不是一個upvote imho。但事後看來,你提供了'set_index',它解決了我的第二個問題,所以我會upvote。再次感謝 – gmarais