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

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 )

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

Ответы (9)

Используйте 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

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

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

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

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

Вы также можете использовать transform () в столбце Number после группировки по. Эта операция вычислит общее количество в одной группе с помощью функции sum, результатом будет серия с тем же индексом, что и исходный фрейм данных.

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

Затем вы можете удалить повторяющиеся строки в столбце Fruit и Name. Кроме того, вы можете удалить столбец Дата, указав ось 1 (0 для строк и 1 для столбцов).

# 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'))

Есть официальное руководство Group by: split-apply-comb, в котором рассказывается о том, что вы можете делать после группировки.

Вы можете установить столбец 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

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

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

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

Оба других ответа достигают желаемого.

Вы можете использовать функцию 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
df.groupby(['Fruit','Name'])['Number'].sum()

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

Вы можете использовать dfsql
для вашей проблемы это будет выглядеть примерно так:

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

https://github.com/mindsdb/dfsql

вот об этом статья:

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

2022 WebDevInsider