2017-01-23 4 views
4

パンダのデータフレームで「合計で累積グループを作成しようとしています。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. にしようとしています:私は、データフレームを持って

    :私はすべてのstackoverflowの答えを見ていると、それらの驚くほどどれも私の(非常に基本)問題を解決することはできません['名前'、 '日付']でグループ化し、

  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"を見たいと思います。言い換えれば、私は連続したすべての日に、人物の合計累積額を見たいと思います。注:同じ人物のある日付に2つのエントリがある場合、それらを合計して実行中のcumsumに追加してから、合計を出力します。

私はアドバイスや助けを感謝します。

答えて

3

あなたは新しい列に出力を割り当て、dropAmount列を削除する必要があります。

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 

はEDIT:

まずgroupby列をNameDateおよび集合体sumgroupbylevelName、および凝集体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

おかげにより提供されたものと同じ答えである、しかし、第2のグループは一緒にジャックの複数の2016年2月29日金額しこり必要があります。したがって、Cumsumは「10、23、10、15」という4つの行しか表示できません。それでも、あなたが提供してくれたことに取り組もうとします。 – gmarais

+0

編集した回答を確認してください。 – jezrael

+0

Genius!完璧なお礼 – 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、私はあなたのコードで達成されていないので、元の希望出力(EDITの前でも)達成されなかったのでdownvoted - ので、少なくともupvote imho。しかし、私は二次的な問題を解決するために 'set_index'を提供していたので、私はupvoteします。再度ありがとう – gmarais