Pandalar gruplandırma ve toplama


208

Bu veri çerçevesini kullanıyorum:

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

İsme göre toplam meyve sayısını elde etmek için bunu isimle ve sonra meyve ile toplamak istiyorum.

Bob,Apples,16 ( for example )

Name ve Fruit'e göre gruplandırmayı denedim ama toplam meyve sayısını nasıl alabilirim?

Yanıtlar:


214

Kullanım 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
Pandalar adlı col toplamını istediğimi nasıl bilebilir Number?
Kingname

12
@Kingname, NAME ve FRUIT'i çıkarırsanız kalan son sütundur. sola 2 sütun eklerseniz, her iki sütunu da
Steven G

10
Hangi sütunun toplanacağı nasıl belirlenir?
tgdn

36
@tgdn df.groupby (['Ad', 'Meyve']) ['Sayı']. toplam ()
Steven G

2
@StevenG Belirli bir sütunu özetlemek için verilen yanıt için, çıktı Dataframe yerine bir Pandas serisi olarak çıkar. Jakub Kukul'un yorumundan (aşağıdaki cevapta), bir Dataframe almak için 'Number' etrafında çift köşeli parantez kullanabiliriz.
skdhfgeq2134

180

Ayrıca agg işlevini kullanabilirsiniz,

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

1
Bu kabul edilen cevaptan farklıdır, çünkü bu bir Seriesdiğeri bir GroupBynesneyi döndürür .
Gaurang Tandon

11
@GaurangTandon DataFrameyerine nesne almak için (kabul edilen cevapta olduğu gibi), etrafında çift köşeli parantez kullanın 'Number', yani:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul

1
Kötü kodlanmış sorgu raporunun temizlenmesinde çok yardımcı olur.
avirr

95

Orijinal sütunları tutmak istiyorsanız Fruitve Namekullanın reset_index(). Aksi halde Fruitve Namedizinin parçası haline gelecektir.

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

Diğer cevaplarda da görüldüğü gibi:

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

Diğer cevaplar da istediğinizi başarıyor.

pivotVerileri güzel bir tabloda düzenlemek için işlevselliği kullanabilirsiniz

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()

Sayıları toplamak için farklı sütunlar seçebilirsiniz.


7

Sen ayarlayabilirsiniz groupbysütun index daha sonra kullanarak sumilelevel

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 () işlevinde bir varyasyon; (1) kalıcı tip DataFrame'e, (2) ortalamaları, sayıları, toplamları vb. uygulama ve (3) okunabilirliği korurken birden çok sütun üzerinde gruplamayı mümkün kılar.

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

değerlerinizi kullanarak ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.