Сумма значений по группам в Pandas: группировка и агрегация

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы получить результат немедленно, примените df.groupby() в сочетании с .sum(). Предположим, у вас есть DataFrame df, и вы хотите сложить значения value_col по категориям group_col:

Python
Скопировать код
summed_data = df.groupby('group_col')['value_col'].sum()

Если же вы хотите сохранить все столбцы в итоговом DataFrame и получить DataFrame, а не Series, используйте следующий код:

Python
Скопировать код
summed_df = df.groupby('group_col', as_index=False).sum()

Этот метод позволяет группировать и подсчитывать данные по одному или нескольким критериям в рамках одной строки кода.

Кинга Идем в IT: пошаговый план для смены профессии

Работа с несколькими столбцами

Если данные нужно сгруппировать по нескольким столбцам, просто перечислите их:

Python
Скопировать код
# Группируем данные по 'Name' и 'Fruit', подсчитываем значения в 'Number'
df_summary = df.groupby(['Name', 'Fruit'])['Number'].sum().reset_index()

Использование функции агрегирования

Для более гибкого анализа используйте функцию agg(). Она поддерживает разные типы агрегаций:

Python
Скопировать код
df_summary = df.groupby(['Name', 'Fruit']).agg({'Number': 'sum'}).reset_index()

Знакомство со сводными таблицами

Создание сводных таблиц — это отличный способ получить кросс-табулированные данные, и оно выполняется довольно просто:

Python
Скопировать код
pivot_table = df.groupby(['Name', 'Fruit'])['Number'].sum().unstack(fill_value=0)

Таким образом данные конвертируются в таблицу уникальных имен (в роли строк) и фруктов (как столбцы), при этом 'Number' суммируется для каждой пары, а пропущенные данные заполняются нулями.

Визуализация

Представьте себе ситуацию: вы в продуктовом магазине, и у вас в корзине есть разные фрукты с ценниками:

Markdown
Скопировать код
🛒: [🍎$2, 🍎$2, 🍊$3, 🍌$1, 🍌$1, 🍌$1]

Как подсчитать общую стоимость? Давайте сгруппируем фрукты по видам и суммируем их стоимость:

Python
Скопировать код
import pandas as pd

data = {'Fruit': ['Apple', 'Apple', 'Orange', 'Banana', 'Banana', 'Banana'],
        'Price': [2, 2, 3, 1, 1, 1]}

df = pd.DataFrame(data)

grouped_sum = df.groupby('Fruit')['Price'].sum()

И вот что у вас получилось на чеке:

Markdown
Скопировать код
| Fruit  | Total Price |
| ------ | ----------- |
| Apple  | $4          |
| Orange | $3          |
| Banana | $3          |

В этом примере GroupBy в Pandas — это ваш умный кассир, который мгновенно подсчитал суммарную стоимость каждого вида фруктов.

Продвинутые возможности и потенциальные трудности

Рассмотрим некоторые более сложные примеры использования и способы решения возникающих проблем:

Суммирование с применением условий

Хотите подсчитать итоговую сумму, исходя из определенного условия? Воспользуйтесь функцией mask:

Python
Скопировать код
df['Number'] = df['Number'].mask(df['Fruit'] == 'Banana', 0)
grouped_conditional_sum = df.groupby('Fruit')['Number'].sum()

Здесь значения 'Number' для всех бананов устанавливаются равными 0 еще до процесса суммирования.

Работа с отсутствующими значениями "NA"

Если в данных есть значения NA, которые вызывают сложности, решите, стоит ли заменить их на другие значения с помощью fillna() до суммирования:

Python
Скопировать код
df['Number'] = df['Number'].fillna(0)
grouped_na_handled_sum = df.groupby('Fruit')['Number'].sum()

Такой подход заменит все значения NA на нули перед их подсчетом.

Повышение производительности

Если вы работаете с большими наборами данных, вы можете оптимизировать использование памяти, изменив типы данных перед процедурой группирования:

Python
Скопировать код
df['Number'] = df['Number'].astype('int32')
grouped_memory_optimized_sum = df.groupby('Fruit')['Number'].sum()

Уменьшение типа столбца до int32 экономит память и повышает производительность при суммировании.

Полезные материалы

  1. pandas.DataFrame.groupby — документация pandas 2.2.0Официальное руководство по функции Pandas groupby.
  2. pandas.DataFrame.sum — документация pandas 2.2.0 — Ваш ключ к освоению функционала суммирования в Pandas.
  3. Group by: разделяй и властвуй — документация pandas 2.2.0 — Все о том, как разделять, анализировать и объединять данные с помощью Pandas.
  4. Использование pandas и Python для исследования набора данных – Real Python — Учебное пособие Real Python о работе с данными с использованием pandas.
  5. Pandas Grouper и функции Agg объяснены – Practical Business Python — Руководство по использованию функций группирования и агрегации Pandas.
  6. Учебное пособие по Python Pandas (Часть 8): Группировка и агрегирование – анализ и исследование данных – YouTubeВидеоруководство по применению функций группировки и агрегирования в Pandas.