Панди згруповані за сумою


205

Я використовую цей кадр даних:

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 )

Я спробував групувати за назвою та фруктами, але як я можу отримати загальну кількість фруктів.

Відповіді:


209

Використання 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

94
Як панди знають, що я хочу підсумовувати посилання з назвою Number?
Kingname

12
@Kingname - це останній стовпець, який залишився, якщо виймете NAME та FRUIT. якщо додати ще 2 стовпчики, то обидва стовпці будуть підсумовані
Steven G

9
Як вказати, який стовпець підсумовувати?
tgdn

34
@tgdn df.groupby (['Ім'я', 'Фрукт']) ['Число']. sum ()
Стівен Г

2
@StevenG Для відповіді, наданої для підведення підсумків конкретного стовпця, вихід виходить у вигляді серії Pandas замість Dataframe. З коментаря Якуба Кукуля (у відповіді нижче), ми можемо використовувати подвійні квадратні дужки навколо "Число", щоб отримати кадр даних.
skdhfgeq2134

178

Також ви можете використовувати функцію agg,

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

1
Це відрізняється від прийнятої відповіді тим, що це повертає a, Seriesтоді як інший повертає GroupByоб'єкт.
Gaurang Tandon

11
@GaurangTandon, щоб отримати DataFrameоб'єкт замість нього (як у прийнятій відповіді), використовуйте подвійні квадратні дужки навколо 'Number', тобто:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Якуб Кукул

1
Дуже корисно при очищенні погано закодованого звіту про запити.
avirr

92

Якщо ви хочете зберегти початкові стовпці Fruitта Name, використовуйте reset_index(). Інакше Fruitі Nameстане частиною індексу.

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стовпець, щоб index потім використовувати за sumдопомогою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

3

Варіація функції .agg (); надає можливість (1) зберігати тип DataFrame, (2) застосовувати середні значення, підрахунки, підсумки тощо. та (3) дозволяє групувати по декількох стовпцях, зберігаючи розбірливість.

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

використовуючи ваші цінності ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.