0Pricing
Pandas & NumPy Academy · Урок

Шаблон «разделить — применить — объединить»

Разберитесь в концептуальном ходе 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 faster

GroupBy с несколькими ключами группировки

Если Вам нужна более высокая детализация, сгруппируйте данные по нескольким столбцам, передав список в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Шаблон «разделить — применить — объединить»
  2. GroupBy с одним и несколькими ключами
  3. Метод agg()
  4. Преобразование и фильтрация GroupBy
← Назад к Pandas & NumPy Academy