Группировка и агрегация в Pandas

PandasBeginner
Практиковаться сейчас

Введение

Группировка и агрегирование данных являются фундаментальными операциями в анализе данных. Они позволяют разделить большой набор данных на более мелкие группы на основе определенных критериев, а затем вычислить сводную статистику для каждой группы. Этот процесс необходим для выявления закономерностей, сравнения сегментов и получения значимых выводов из необработанных данных.

В библиотеке Pandas для анализа данных Python эта стратегия "разделение-применение-объединение" (split-apply-combine) в основном реализуется мощным методом groupby(). В этой лабораторной работе вы научитесь использовать groupby() для выполнения группировки и агрегирования. Вы начнете с группировки данных по одному столбцу, применения функций агрегирования, использования нескольких функций одновременно, группировки по нескольким столбцам и, наконец, форматирования вывода в стандартный DataFrame.

Группировка по одному столбцу с помощью groupby

На этом шаге вы изучите базовое использование метода groupby() для разделения DataFrame на группы. Сам метод groupby() ничего не вычисляет, а возвращает объект DataFrameGroupBy. Этот объект содержит всю информацию, необходимую для последующего применения вычислений к каждой группе.

Сначала сгруппируем наш пример DataFrame по столбцу Category. Это создаст отдельные группы для 'Electronics', 'Clothing' и 'Books'.

Откройте файл main.py в редакторе слева. Начальный код для создания DataFrame уже там. Добавьте следующий код в конец файла main.py:

## Group by the 'Category' column
grouped_by_category = df.groupby('Category')

## The result is a DataFrameGroupBy object
print("Type of the grouped object:")
print(type(grouped_by_category))

## To see the contents, you can iterate over the groups
print("\nIterating over groups to see their content:")
for name, group in grouped_by_category:
    print(f"\nGroup: {name}")
    print(group)

Теперь запустите скрипт из терминала, чтобы увидеть вывод.

python3 main.py

Вы увидите исходный DataFrame, за которым последует тип объекта groupby, а затем содержимое каждой группы. Это демонстрирует, что DataFrame был успешно разделен на основе уникальных значений в столбце 'Category'.

Original DataFrame:
      Category Region  Sales  Units
0  Electronics  North   1200     10
1     Clothing  South    800     25
2  Electronics  North   1500      8
3        Books   West    300     15
4     Clothing   East    900     20
5        Books   West    450     18

==============================

Type of the grouped object:
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

Iterating over groups to see their content:

Group: Books
  Category Region  Sales  Units
3    Books   West    300     15
5    Books   West    450     18

Group: Clothing
   Category Region  Sales  Units
1  Clothing  South    800     25
4  Clothing   East    900     20

Group: Electronics
      Category Region  Sales  Units
0  Electronics  North   1200     10
2  Electronics  North   1500      8

Применение агрегации sum к группам

На этом шаге вы научитесь применять функцию агрегирования к созданным вами группам. После группировки данных наиболее распространенным следующим шагом является выполнение вычисления, такого как sum(), mean(), count() или max(), для каждой группы.

Давайте рассчитаем общий объем продаж для каждой категории продуктов. Для этого сначала сгруппируйте по Category, а затем выберите столбец Sales, чтобы применить функцию sum().

Добавьте следующий код в конец вашего файла main.py. Вы можете удалить цикл for из предыдущего шага, чтобы вывод был чистым.

## Group by 'Category' and calculate the sum of 'Sales' for each group
category_sales_sum = df.groupby('Category')['Sales'].sum()

print("Total sales per category:")
print(category_sales_sum)

Сохраните файл и запустите его снова.

python3 main.py

Теперь вывод покажет Pandas Series, где индексом является название категории, а значениями — общий объем продаж для этой категории.

... (previous output) ...

Total sales per category:
Category
Books           750
Clothing       1700
Electronics    2700
Name: Sales, dtype: int64

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

Агрегация нескольких функций с помощью agg

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

Методу agg() можно передать список строк, где каждая строка — это имя функции агрегирования. Давайте рассчитаем как sum (сумму), так и mean (среднее) для Sales по каждой Category.

Добавьте следующий код в конец вашего файла main.py:

## Group by 'Category' and apply multiple aggregations on 'Sales'
category_agg = df.groupby('Category')['Sales'].agg(['sum', 'mean'])

print("\nSum and mean of sales per category:")
print(category_agg)

Сохраните файл и выполните его.

python3 main.py

Вывод теперь представляет собой DataFrame. Индексом по-прежнему является Category, но столбцы иерархические, показывающие как sum (сумму), так и mean (среднее) для данных Sales.

... (previous output) ...

Sum and mean of sales per category:
              sum    mean
Category
Books         750   375.0
Clothing     1700   850.0
Electronics  2700  1350.0

Метод agg() предоставляет гибкий способ генерации исчерпывающих сводок ваших сгруппированных данных.

Группировка по нескольким столбцам

На этом шаге вы научитесь группировать DataFrame по нескольким столбцам. Это полезно для создания более детализированных групп и анализа взаимодействий между различными категориями. Для этого просто передайте список имен столбцов методу groupby().

Найдем общий объем продаж для каждой комбинации Region (регион) и Category (категория). Это покажет нам, как продажи различных категорий продуктов распределяются по регионам.

Добавьте следующий код в конец вашего файла main.py:

## Group by multiple columns: 'Region' and 'Category'
multi_group_sum = df.groupby(['Region', 'Category'])['Sales'].sum()

print("\nTotal sales per Region and Category:")
print(multi_group_sum)

Сохраните файл и запустите скрипт.

python3 main.py

Вывод будет иметь MultiIndex (множественный индекс) в строках, где первый уровень — это Region, а второй уровень — Category. Это обеспечивает детальную разбивку продаж.

... (previous output) ...

Total sales per Region and Category:
Region  Category
East    Clothing        900
North   Electronics    2700
South   Clothing        800
West    Books           750
Name: Sales, dtype: int64

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

Сброс индекса в сгруппированном DataFrame

На этом шаге вы научитесь преобразовывать сгруппированный вывод обратно в обычный DataFrame, где ключи группировки являются столбцами, а не индексом. По умолчанию groupby() делает ключи группировки индексом результирующей серии или DataFrame. Иногда вам нужен "плоский" DataFrame для дальнейшей обработки или визуализации.

Самый простой способ добиться этого — использовать параметр as_index=False в методе groupby().

Давайте повторим группировку по одному столбцу из Шага 2, но на этот раз мы сохраним Category как обычный столбец.

Добавьте следующий код в конец вашего файла main.py:

## Group by 'Category' and aggregate, but keep 'Category' as a column
category_sales_flat = df.groupby('Category', as_index=False)['Sales'].sum()

print("\nGrouped data with 'Category' as a column:")
print(category_sales_flat)

Сохраните файл и запустите его в последний раз.

python3 main.py

Обратите внимание на вывод. Вместо того чтобы Category был индексом, теперь это первый столбец нового DataFrame, а сам DataFrame имеет стандартный целочисленный индекс (0, 1, 2).

... (previous output) ...

Grouped data with 'Category' as a column:
      Category  Sales
0        Books    750
1     Clothing   1700
2  Electronics   2700

Этот формат часто более удобен для последующих задач манипулирования данными. Альтернативный метод — вызвать .reset_index() для сгруппированного результата, что дает тот же эффект.

Резюме

Поздравляем с завершением этой лабораторной работы по группировке и агрегации данных с помощью Pandas! Вы освоили одну из самых мощных и часто используемых функций библиотеки Pandas для анализа данных.

В этой лабораторной работе вы практиковались в:

  • Разделении DataFrame на группы с использованием df.groupby('column_name').
  • Применении одной агрегирующей функции, такой как .sum(), к группам.
  • Использовании метода .agg() для одновременного применения нескольких агрегирующих функций.
  • Группировке по нескольким столбцам для создания иерархического резюме с использованием df.groupby(['col1', 'col2']).
  • Создании плоского DataFrame из операции groupby с использованием параметра as_index=False.

Овладение этими методами является важным шагом на пути к совершенствованию в манипулировании и анализе данных с использованием Python и Pandas.