Введение
Группировка и агрегирование данных являются фундаментальными операциями в анализе данных. Они позволяют разделить большой набор данных на более мелкие группы на основе определенных критериев, а затем вычислить сводную статистику для каждой группы. Этот процесс необходим для выявления закономерностей, сравнения сегментов и получения значимых выводов из необработанных данных.
В библиотеке 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.



