Kelompok Panda-oleh dan jumlah

206

Saya menggunakan bingkai data ini:

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

Saya ingin menggabungkan ini dengan nama dan kemudian dengan buah untuk mendapatkan jumlah total buah per nama.

Bob,Apples,16 ( for example )

Saya mencoba mengelompokkan berdasarkan Nama dan Buah tetapi bagaimana cara mendapatkan jumlah total buah.

Mencoba dengan keras
sumber

Jawaban:

210

Gunakan 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
Steven G
sumber
95
Bagaimana panda tahu bahwa saya ingin menjumlahkan nama col Number?
Kingname
12
@ Kingname, itu kolom terakhir yang tersisa jika Anda menghapus NAME dan BUAH. jika Anda menambahkan 2 kolom lagi, itu akan menjumlahkan kedua kolom
Steven G
9
Bagaimana cara menentukan kolom mana yang akan dijumlahkan?
tgdn
35
@tgdn df.groupby (['Name', 'Fruit']) ['Number']. sum ()
Steven G
2
@ SvenvenG Untuk jawaban yang diberikan untuk meringkas kolom tertentu, output keluar sebagai seri Pandas, bukan Dataframe. Dari komentar oleh Jakub Kukul (dalam jawaban di bawah), kita dapat menggunakan tanda kurung ganda di sekitar 'Nomor' untuk mendapatkan Dataframe.
skdhfgeq2134
179

Anda juga dapat menggunakan fungsi agg,

df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
Saurabh
sumber
1
Ini berbeda dari jawaban yang diterima karena ini mengembalikan a Seriessedangkan yang lain mengembalikan GroupByobjek.
Gaurang Tandon
11
@ GaurangTandon untuk mendapatkan DataFrameobjek sebagai gantinya (seperti dalam jawaban yang diterima), gunakan tanda kurung ganda 'Number', yaitu:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul
1
Sangat membantu dalam membersihkan laporan permintaan yang disandikan dengan buruk.
avirr
93

Jika Anda ingin menyimpan kolom asli Fruitdan Name, gunakan reset_index(). Kalau tidak Fruitdan Nameakan menjadi bagian dari indeks.

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

Seperti yang terlihat pada jawaban lain:

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
Gazala Muhamed
sumber
43

Keduanya menjawab apa yang Anda inginkan.

Anda dapat menggunakan pivotfungsionalitas untuk mengatur data dalam tabel yang bagus

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
Pisang Demetri
sumber
19
df.groupby(['Fruit','Name'])['Number'].sum()

Anda dapat memilih kolom berbeda untuk menjumlahkan angka.

Jared
sumber
7

Anda dapat mengatur groupbykolom untuk index kemudian menggunakan sumdenganlevel

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
YOBEN_S
sumber
3

Variasi pada fungsi .agg (); memberikan kemampuan untuk (1) tetap menggunakan tipe DataFrame, (2) menerapkan rata-rata, jumlah, penjumlahan, dll. dan (3) memungkinkan groupby pada banyak kolom sambil mempertahankan keterbacaan.

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

menggunakan nilai-nilai Anda ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
xxyjoel
sumber