Шаблон «разделить — применить — объединить»
Разберитесь в концептуальном ходе groupby: разделении DataFrame на группы, применении функции и объединении результатов.
«Шаблон «разделить — применить — объединить»» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Что такое GroupBy?
Операция GroupBy — один из самых мощных шаблонов анализа данных. Она позволяет разделить DataFrame на группы, применить функцию к каждой группе независимо, а затем объединить результаты в новую структуру. Этот рабочий процесс известен как шаблон разделить–применить–объединить; этот термин ввёл статистик Хэдли Викхэм.
Шаг разделения
На шаге разделения Pandas делит DataFrame на подчинённые DataFrames на основе уникальных значений одного или нескольких столбцов. Например, если в данных есть столбец region со значениями 'North', 'South' и 'West', на шаге разделения создаются три отдельные группы. Данные пока не перемещаются и не копируются — Pandas лишь фиксирует, какие строки относятся к каждой группе.
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'North', 'West', 'South'],
'sales': [200, 150, 300, 180, 220]
})
# split: create a GroupBy object
grouped = df.groupby('region')
print(type(grouped)) # DataFrameGroupByШаг применения
На шаге применения функция применяется к каждой группе независимо. Это может быть встроенная агрегирующая функция, например sum() или mean(), либо пользовательская функция, которую Вы определили. Строки каждой группы передаются функции, и она возвращает скаляр, Series или DataFrame.
# apply: compute the sum of 'sales' within each region group
total_sales = grouped['sales'].sum()
print(total_sales)
# region
# North 500
# South 370
# West 180
# Name: sales, dtype: int64Шаг объединения
На шаге объединения Pandas автоматически собирает результаты для отдельных групп обратно в один объект — обычно Series или DataFrame. Ключи групп становятся индексом результата. Этот шаг выполняется незаметно при вызове метода агрегации для объекта GroupBy, в результате чего получается удобная сводная таблица с одной строкой на группу.
# combine happens automatically — result is a Series indexed by 'region'
print(total_sales.index) # Index(['North', 'South', 'West'])
print(total_sales.values) # [500, 370, 180]Создание объекта GroupBy
Объект GroupBy создаётся вызовом df.groupby(column). На этом этапе вычисления не выполняются — это отложенный объект. Вы можете перебрать его, чтобы просмотреть группы, или добавить цепочку с методом агрегации, чтобы запустить вычисления. Передача as_index=False сохраняет столбец группировки как обычный столбец, а не как индекс результата.
grouped = df.groupby('region', as_index=False)
result = grouped['sales'].sum()
print(result)
# region sales
# 0 North 500
# 1 South 370
# 2 West 180Перебор групп
Объект GroupBy можно перебрать, чтобы изучить каждую группу отдельно. На каждой итерации возвращается кортеж (group_key, sub_dataframe). Это полезно для отладки или обработки каждой группы произвольным кодом Python. Однако в рабочем коде для повышения производительности предпочтительнее векторизованные методы агрегации, а не явный перебор.
for name, group in df.groupby('region'):
print(f'--- {name} ---')
print(group)
# --- North ---
# region sales
# 0 North 200
# 2 North 300
# --- South ---
# region sales
# 1 South 150
# 4 South 220Распространённые функции агрегации
GroupBy в Pandas поддерживает множество встроенных функций агрегации: sum(), mean(), count(), min(), max(), std(), median() и другие. Они тщательно оптимизированы и обрабатывают все группы за один проход. Всегда отдавайте им предпочтение перед написанием пользовательской функции Python, если нужная встроенная функция уже существует.
print(df.groupby('region')['sales'].mean())
# region
# North 250.0
# South 185.0
# West 180.0
print(df.groupby('region')['sales'].count())
# region
# North 2
# South 2
# West 1Группировка нескольких столбцов одновременно
Вы можете применять агрегирование сразу к нескольким столбцам: выберите их перед вызовом метода агрегирования или не выбирайте столбцы, чтобы агрегировать все числовые столбцы. Результатом будет DataFrame, а не Series, с одним столбцом для каждой агрегированной переменной.
df2 = pd.DataFrame({
'region': ['North', 'South', 'North', 'South'],
'units': [10, 8, 12, 9],
'revenue': [200, 160, 240, 180]
})
print(df2.groupby('region').sum())
# units revenue
# region
# North 22 440
# South 17 340Ментальная модель GroupBy
Представьте GroupBy как предложение GROUP BY в SQL. Код Pandas df.groupby('region')['sales'].sum() эквивалентен запросу SELECT region, SUM(sales) FROM df GROUP BY region в SQL. Понимание этой аналогии помогает переходить от одного инструмента к другому и выбирать подходящую абстракцию для вашего конвейера.
# Pandas GroupBy is equivalent to SQL GROUP BY
# SQL: SELECT region, SUM(sales) FROM df GROUP BY region
# Pandas: df.groupby('region')['sales'].sum()
result = df.groupby('region')['sales'].sum().reset_index()
result.columns = ['region', 'total_sales']
print(result)Зачем использовать цикл
Возможно, Вы задаётесь вопросом, почему бы просто не пройти циклом по уникальным значениям и не вычислить статистики вручную. Ответ — производительность и читаемость. Цикл Python по группам работает гораздо медленнее одного векторизованного вызова groupby, особенно на больших наборах данных. Операции GroupBy внутри выполняются в скомпилированном коде C, поэтому они в 10–100 раз быстрее эквивалентных циклов Python.
# Slow approach with a loop
results = {}
for region in df['region'].unique():
subset = df[df['region'] == region]
results[region] = subset['sales'].sum()
# Fast approach with GroupBy
results_fast = df.groupby('region')['sales'].sum().to_dict()
# Both give the same answer, but GroupBy is orders of magnitude fasterGroupBy с несколькими ключами группировки
Если Вам нужна более высокая детализация, сгруппируйте данные по нескольким столбцам, передав список в groupby(). Результатом будет MultiIndex, где каждый уровень соответствует одному столбцу группировки. Например, группировка одновременно по 'region' и 'quarter' даёт итоги для каждой комбинации региона и квартала.
df3 = pd.DataFrame({
'region': ['North', 'North', 'South', 'South'],
'quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
'sales': [200, 300, 150, 220]
})
print(df3.groupby(['region', 'quarter'])['sales'].sum())
# region quarter
# North Q1 200
# Q2 300
# South Q1 150
# Q2 220Быстрая проверка
Проверьте, насколько хорошо Вы поняли рассмотренный на этом уроке шаблон разделения, применения и объединения.
Итоги урока
На этом уроке Вы узнали о шаблоне разделения, применения и объединения, лежащем в основе всех операций GroupBy; о том, как создавать объект GroupBy с помощью df.groupby(); и о том, как применять встроенные агрегирования, такие как sum() и mean(), чтобы получать один результат для каждой группы. Далее мы рассмотрим группировку по одному и нескольким ключам с использованием других методов агрегирования.
Часто задаваемые вопросы
Урок «Шаблон «разделить — применить — объединить»» бесплатный?
Да — полный текст урока «Шаблон «разделить — применить — объединить»» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблон «разделить — применить — объединить»»?
Разберитесь в концептуальном ходе groupby: разделении DataFrame на группы, применении функции и объединении результатов. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Шаблон «разделить — применить — объединить»»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Шаблон «разделить — применить — объединить»
- GroupBy с одним и несколькими ключами
- Метод agg()
- Преобразование и фильтрация GroupBy