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


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

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


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.