#python-3.x #pandas #dataframe
#python #pandas #фрейм данных #сгруппировать #агрегировать
Вопрос:
Я использую этот фрейм данных:
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
Я хочу объединить это по Name
, а затем по Fruit
, чтобы получить общее количество Fruit
per Name
. Например:
Bob,Apples,16
Я пробовал группировать по Name
и Fruit
, но как мне получить общее количество фруктов?
Комментарии:
1.вы можете использовать dfsql df.sql (‘ВЫБЕРИТЕ фрукты, сумму (число) ГРУППИРОВАТЬ ПО фруктам ‘) github.com/mindsdb/dfsql medium.com/riselab /…
Ответ №1:
Используйте 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
Комментарии:
1. Как pandas узнает, что я хочу суммировать столбец с именем
Number
?2. @Kingname это последний оставшийся столбец, если вы уберете NAME и FRUIT. если вы добавите 2 оставшихся столбца, это приведет к суммированию обоих столбцов
3. Как указать, какой столбец суммировать?
4. @tgdn df.groupby([‘Name’, ‘Fruit’])[‘Number’].sum()
5. @StevenG Для ответа, предоставленного для суммирования определенного столбца, вывод выводится в виде серии Pandas вместо фрейма данных. Из комментария Якуба Кукула (в приведенном ниже ответе) мы можем использовать двойные квадратные скобки вокруг «Числа», чтобы получить фрейм данных.
Ответ №2:
Также вы можете использовать функцию agg,
df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
Комментарии:
1. Это отличается от принятого ответа тем, что возвращает a
Series
, тогда как другой возвращаетGroupBy
объект.2. @GaurangTandon чтобы
DataFrame
вместо этого получить объект (как в принятом ответе), используйте двойные квадратные скобки вокруг'Number'
, т.е.:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
3. Очень полезно при очистке отчета с плохо закодированным запросом.
Ответ №3:
Если вы хотите сохранить исходные столбцы 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
Ответ №4:
Оба других ответа выполняют то, что вы хотите.
Вы можете использовать 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
Ответ №5:
df.groupby(['Fruit','Name'])['Number'].sum()
Вы можете выбрать разные столбцы для суммирования чисел.
Ответ №6:
Вариант функции .agg(); предоставляет возможность (1) сохранять тип DataFrame, (2) применять средние значения, подсчеты, суммирование и т. Д. И (3) позволяет группировать по нескольким столбцам, сохраняя при этом разборчивость.
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
используя ваши значения…
df.groupby(['Name', 'Fruit']).agg({'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
Ответ №8:
Вы также можете использовать transform() для столбца Number
после group by. Эта операция вычислит общее число в одной группе с помощью функции sum
, результатом будет серия с тем же индексом, что и исходный фрейм данных.
df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)
Затем вы можете удалить повторяющиеся строки в столбце Fruit
и Name
. Кроме того, вы можете удалить столбец Date
, указав ось 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-combine, в котором рассказывается о том, что вы можете сделать после group by.
Комментарии:
1. Это было именно то, что я искал!! Я был потерян, как добавить
sum
значение изgroupby()[].sum()
в «уникальный» фрейм данных! Спасибо!
Ответ №9:
Вы можете использовать dfsql
для своей проблемы, это будет выглядеть примерно так:
df.sql('SELECT fruit, sum(number) GROUP BY fruit')
https://github.com/mindsdb/dfsql
вот статья об этом:
Комментарии:
1. Это было то, о чем я всегда мечтал… Спасибо!
Ответ №10:
Если вы хотите, чтобы агрегированный столбец имел пользовательское имя Total Number
, например Total
, и т.д. (все решения, приведенные здесь, приводят к созданию фрейма данных, в котором указан столбец aggregate Number
), используйте именованную агрегацию:
df.groupby(['Fruit', 'Name'], as_index=False).agg(**{'Total Number': ('Number', 'sum')})
или (если в пользовательском имени не обязательно должен быть пробел):
df.groupby(['Fruit', 'Name'], as_index=False).agg(Total=('Number', 'sum'))
это эквивалентно SQL-запросу:
SELECT Fruit, Name, sum(Number) AS Total
FROM df
GROUP BY Fruit, Name
Говоря о SQL, есть pandasql
модуль, который позволяет запрашивать фреймы данных pandas в локальной среде, используя синтаксис SQL. Он не является частью Pandas, поэтому его нужно будет устанавливать отдельно.
#! pip install pandasql
from pandasql import sqldf
sqldf("""
SELECT Fruit, Name, sum(Number) AS Total
FROM df
GROUP BY Fruit, Name
""")