パンダのグループ別と合計


206

私はこのデータフレームを使用しています。

Fruit   Date      Name  Number
Apples  10/6/2016 Bob    7
Apples  10/6/2016 Bob    8
Apples  10/6/2016 Mike   9
Apples  10/7/2016 Steve 10
Apples  10/7/2016 Bob    1
Oranges 10/7/2016 Bob    2
Oranges 10/6/2016 Tom   15
Oranges 10/6/2016 Mike  57
Oranges 10/6/2016 Bob   65
Oranges 10/7/2016 Tony   1
Grapes  10/7/2016 Bob    1
Grapes  10/7/2016 Tom   87
Grapes  10/7/2016 Bob   22
Grapes  10/7/2016 Bob   12
Grapes  10/7/2016 Tony  15

これを名前で集計し、次に果物で集計して、名前ごとの果物の総数を取得します。

Bob,Apples,16 ( for example )

名前と果物でグループ化してみましたが、果物の総数を取得するにはどうすればよいですか。

回答:


210

使用GroupBy.sum

df.groupby(['Fruit','Name']).sum()

Out[31]: 
               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Grapes  Bob        35
        Tom        87
        Tony       15
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

95
名前の付いたcolを合計したいことをパンダはどのようにして知ることができますNumberか?
Kingname

12
@Kingname NAMEとFRUITを削除すると、最後の列になります。左に2列追加すると、両方の列が合計されます
Steven G

9
合計する列を指定する方法は?
tgdn

35
@tgdn df.groupby(['Name'、 'Fruit'])['Number']。sum()
Steven G

2
@StevenG特定の列を合計するために提供された回答の場合、出力はDataframeではなくPandasシリーズとして出力されます。Jakub Kukulのコメント(以下の回答)から、「番号」を二重の角括弧で囲んでデータフレームを取得できます。
skdhfgeq2134

179

また、agg関数を使用できます。

df.groupby(['Name', 'Fruit'])['Number'].agg('sum')

1
これは受け入れられた回答とは異なり、これはaを返しますSeriesが、もう1つはGroupByオブジェクトを返します。
Gaurang Tandon

11
@GaurangTandonがDataFrame代わりにオブジェクトを取得するには(承認された回答のように)、二重の角括弧を'Number'で囲みます。つまり、df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul

1
正しくエンコードされていないクエリレポートのクリーンアップに非常に役立ちます。
-avirr

93

元の列Fruitとを保持する場合はName、を使用しますreset_index()。そうでない場合FruitName、インデックスの一部となります。

df.groupby(['Fruit','Name'])['Number'].sum().reset_index()

Fruit   Name       Number
Apples  Bob        16
Apples  Mike        9
Apples  Steve      10
Grapes  Bob        35
Grapes  Tom        87
Grapes  Tony       15
Oranges Bob        67
Oranges Mike       57
Oranges Tom        15
Oranges Tony        1

他の回答に見られるように:

df.groupby(['Fruit','Name'])['Number'].sum()

               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Grapes  Bob        35
        Tom        87
        Tony       15
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

43

他の両方の答えはあなたが望むものを達成します。

このpivot機能を使用して、データを素敵なテーブルに配置できます

df.groupby(['Fruit','Name'],as_index = False).sum().pivot('Fruit','Name').fillna(0)



Name    Bob     Mike    Steve   Tom    Tony
Fruit                   
Apples  16.0    9.0     10.0    0.0     0.0
Grapes  35.0    0.0     0.0     87.0    15.0
Oranges 67.0    57.0    0.0     15.0    1.0

19
df.groupby(['Fruit','Name'])['Number'].sum()

異なる列を選択して数値を合計できます。


7

次に、groupby列を 設定しindexsumlevel

df.set_index(['Fruit','Name']).sum(level=[0,1])
Out[175]: 
               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Oranges Bob        67
        Tom        15
        Mike       57
        Tony        1
Grapes  Bob        35
        Tom        87
        Tony       15

3

.agg()関数のバリエーション。(1)タイプDataFrameを永続化する機能、(2)平均、カウント、合計などを適用する機能、および(3)読みやすさを維持しながら複数の列でgroupbyを有効にする機能を提供します。

df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})

あなたの値を使用して...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.