Panda’s groeperen op en optellen

Ik gebruik dit dataframe:

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

Ik wil dit op naam optellen en vervolgens op fruit om een ​​totaal aantal fruit per naam te krijgen.

Bob,Apples,16 ( for example )

Ik heb geprobeerd te groeperen op naam en fruit, maar hoe kom ik aan het totale aantal fruit.


Antwoord 1, autoriteit 100%

Gebruik 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

Antwoord 2, autoriteit 67%

U kunt ook de agg-functie gebruiken,

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

Antwoord 3, autoriteit 45%

Als je de originele kolommen Fruiten Namewilt behouden, gebruik dan reset_index(). Anders worden Fruiten Nameonderdeel van de index.

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

Zoals te zien in de andere antwoorden:

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

Antwoord 4, autoriteit 17%

Beide andere antwoorden bereiken wat je wilt.

U kunt de pivot-functionaliteit gebruiken om de gegevens in een mooie tabel te rangschikken

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

Antwoord 5, autoriteit 8%

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

U kunt verschillende kolommen selecteren om getallen op te tellen.


Antwoord 6, autoriteit 4%

Een variatie op de .agg() functie; biedt de mogelijkheid om (1) het type DataFrame aan te houden, (2) gemiddelden, tellingen, sommaties, enz. toe te passen en (3) groupby op meerdere kolommen mogelijk te maken terwijl de leesbaarheid behouden blijft.

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

uw waarden gebruiken…

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

Antwoord 7, autoriteit 3%

U kunt de kolom groupbyinstellen op indexen vervolgens sumgebruiken met level

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

Antwoord 8

U kunt ook transform()in kolom Numberna groeperen op. Deze bewerking berekent het totale aantal in één groep met functie sum, het resultaat is een reeks met dezelfde index als het originele dataframe.

df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)

Vervolgens kun je de dubbele rijen in de kolom Fruiten Nameneerzetten. Bovendien kunt u de kolom Datelaten vallen door as 1op te geven (0voor rijen en 1voor kolommen).

# print(df)
      Fruit   Name  Number
0    Apples    Bob      16
2    Apples   Mike       9
3    Apples  Steve      10
5   Oranges    Bob      67
6   Oranges    Tom      15
7   Oranges   Mike      57
9   Oranges   Tony       1
10   Grapes    Bob      35
11   Grapes    Tom      87
14   Grapes   Tony      15
# You could achieve the same result with functions discussed by others: 
# print(df.groupby(['Fruit', 'Name'], as_index=False)['Number'].sum())
# print(df.groupby(['Fruit', 'Name'], as_index=False)['Number'].agg('sum'))

Er is een officiële tutorial Groeperen op: split-apply-combine praten over wat je kunt doen na group by.


Antwoord 9

U kunt dfsql
. gebruiken
voor uw probleem ziet het er ongeveer zo uit:

df.sql('SELECT fruit, sum(number) GROUP BY fruit')

https://github.com/mindsdb/dfsql

hier is een artikel over:

https://medium.com/riselab/why-every-data-scientist-using-pandas-needs-modin-bringing-sql-to-dataframes-3b216b29a7c0

LEAVE A REPLY

Please enter your comment!
Please enter your name here

1 × 2 =

Other episodes