Панды сгруппированы по сумме

207

Я использую этот фрейм данных:

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 )

Я попытался сгруппировать по Имени и Фруктам, но как узнать общее количество фруктов.

Усердно пытаться
источник

Ответы:

211

Используйте 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
Как панды знают, что я хочу сложить названное кол Number?
Kingname
12
@Kingname это последний оставшийся столбец, если вы уберете NAME и FRUIT. если вы добавите 2 оставленных столбца, это будет сумма обоих столбцов
Стивен G
9
Как указать, какой столбец суммировать?
tgdn
36
@tgdn df.groupby (['Name', 'Fruit']) ['Number']. sum ()
Стивен Г.
2
@StevenG Для ответа, предоставленного для суммирования определенного столбца, вывод выходит в виде ряда Pandas вместо Dataframe. Из комментария Якуба Кукула (в ответе ниже) мы можем использовать двойные квадратные скобки вокруг 'Number', чтобы получить Dataframe.
skdhfgeq2134
179

Также вы можете использовать функцию agg,

df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
Саурабх
источник
1
Это отличается от принятого ответа тем, что возвращает a, Seriesтогда как другой возвращает GroupByобъект.
Гауранг Тандон
11
@GaurangTandon, чтобы DataFrameвместо этого получить объект (как в принятом ответе), используйте двойные квадратные скобки 'Number', то есть:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Якуб
1
Очень полезно для очистки плохо закодированного отчета о запросах.
Avirr
93

Если вы хотите сохранить исходные столбцы 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()

Вы можете выбрать разные столбцы для суммирования чисел.

Jared
источник
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
YOBEN_S
источник
3

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

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

используя ваши ценности ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
xxyjoel
источник