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 Fruit
en Name
wilt behouden, gebruik dan reset_index()
. Anders worden Fruit
en Name
onderdeel 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 groupby
instellen op index
en vervolgens sum
gebruiken 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 Number
na 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 Fruit
en Name
neerzetten. Bovendien kunt u de kolom Date
laten vallen door as 1
op te geven (0
voor rijen en 1
voor 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: