パンダの2つの列でグループ化された値を合計する方法


21

次のようなPandas DataFrameがあります。

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

このような新しいDataFrameを生成するにはどうすればよいですか:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

回答:


16

pivot_table これのために作られました:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

結果として

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

個人的には、このアプローチは理解がはるかに簡単で、確かに複雑なgroupby操作よりもPythonに近いと思います。次に、指定した形式が必要な場合は、それを整理できます。

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

あなたに与える

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
いいね!これは受け入れられた答えでなければなりません。
tuomastik

@ジョシュD。これはクールで簡単です!groupbyがどのように機能するかを理解するには、ある程度の脳力が必要であることに同意します。ありがとうございました!
ケビン

8

パンダブラックマジック:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

結果df

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

聖なる!黒魔術はとても強力です!どうもありがとう!
ケビン

どういたしまして!更新された回答をご覧ください。式を単純化し、列名の修正を要求どおりに追加しました。
-tuomastik

以前のバージョンは、他のより複雑なデータセットに適用できるため、利点があると思います。ここにコピーしました:df.groupby(['Date'、 'Groups'、 'data'])['data']。sum()。sum(level = ['Date'、 'Groups']))。unstack( 'グループ').fillna(0)
ケビン

@Kevinこれまたは将来の回答で問題が解決した場合は、回答を受け入れてください。
-tuomastik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.