Применение нескольких функций к группам столбцов в Pandas

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

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

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

Чтобы применить различные функции к нескольким столбцам DataFrame после группировки с использованием groupby, вам необходимо подготовить словарь. Здесь ключами служат названия столбцов, а значениями – списки функций. Полученный словарь передаётся в метод agg() для агрегации данных.

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

# Создание DataFrame
df = pd.DataFrame({
    'Group': ['A', 'A', 'B', 'B'], 
    'Data1': [10, 20, 30, 40], 
    'Data2': [100, 200, 300, 400]
})

# Словарь для агрегации данных
multi_agg = {
    'Data1': ['sum', 'mean'],
    'Data2': ['max', 'min']
}

# Группировка и агрегация данных
grouped_result = df.groupby('Group').agg(multi_agg)

print(grouped_result)

В приведённом коде данные группируются по столбцу 'Group', для 'Data1' вычисляются сумма и среднее значение, а для 'Data2' – максимальное и минимальное значения.

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

Обогатите свои возможности с помощью собственных функций

Стандартные функции замечательны, однако порой требуются более специфические варианты. В этом случае создавайте и используйте вашу собственную функцию.

Python
Скопировать код
def my_custom_agg(series):
    return pd.Series({'CustomSum': series.sum(), 'CustomMean': series.mean()})

grouped_custom = df.groupby('Group')['Data1'].apply(my_custom_agg)

Создание собственной функции агрегации открывает новый уровень контроля над обработкой данных.

Применение лямбда-функций на ходу

Лямбда-функции — это компактный и удобный инструмент для обработки данных:

Python
Скопировать код
grouped_lambda = df.groupby('Group').agg({
    'Data1': lambda x: x.max() – x.min(),  # Диапазон значений.
    'Data2': lambda x: sum(x > 250)  # Количество значений выше 250.
})

Назовите функцию: использование именованных агрегатов

Начиная с версии pandas 0.25.0 появилась возможность применять именованные агрегации, улучшающие читаемость синтаксиса и организацию получаемых результатов:

Python
Скопировать код
grouped_named = df.groupby('Group').agg(
    total=('Data1', 'sum'),
    average=('Data1', 'mean'),
    maximum=('Data2', 'max'),
    above_threshold=('Data2', lambda x: (x > 250).sum())
)

Именованные агрегации улучшают читаемость кода и организацию результатов обработки данных.

Лучшие практики

Устаревший индексатор .ix

Избегайте использования .ix, он устарел. Рекомендуется применять .loc и .iloc для правильной работы с данными.

Нету словарей внутри словарей для agg

Избегайте использования словарей в качестве элементов других словарей при работе с методом agg(). Лучше отдавать предпочтение более линейным структурам или лямбда-функциям для написания чистого и надёжного кода.

Ситуация с взаимозависимыми группами

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

Python
Скопировать код
def complex_agg(group):
    max_val = group['Data2'].max()  # Максимальное значение.
    group['Modified'] = group['Data1'] + max_val  # Модификация Data1.
    return group

enhanced_groups = df.groupby('Group').apply(complex_agg)

Важно учитывать не только отдельные операции, но и связи между данными.

Не бойтесь использовать множественные индексы

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

functools.partial(), фундаментальный помощник в трудную минуту

Когда вам нужно передать дополнительные аргументы в функции при агрегации, прибегайте к помощи functools.partial().

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

Узнаем на практике, как это работает:

🧅👉🧂: Добавьте специи в лук
🥕👉🔪: Нарежьте морковь
🥔👉🍳: Обжарьте картофель

Выполняете операции (функции) над группами данных (переменными). Всё прозрачно и понятно!

Кастомизируйте свою лямбду

Обходите ограничения, добиваясь лучших результатов при использовании в лямбда-функциях доступа к другим столбцам с использованием pd.Series() и других методов. В Python всегда найдётся решение!

Python
Скопировать код
grouped_trick = df.groupby('Group').agg({
    'Data1': lambda x: (x + df.loc[x.index, 'Data2']).mean()
})

Оставайтесь в курсе, регулярно обновляя свои знания

Быть опытным Python-разработчиком означает не только уметь писать код, но и постоянно чтение документации. Обновления могут внести существенные изменения!

Гибкое именование столбцов

В мире изменений названия столбцов также должны быть гибкими. Не забывайте использовать атрибут __name__ для динамизации именования столбцов.

Сокращаем итерацию вручную до минимума

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

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

  1. Group by: split-apply-combine — документация pandas 2.2.0
  2. Как скомбинировать несколько столбцов при использовании Pandas groupby, используя словарь – GeeksforGeeks
  3. GroupBy — документация pandas 2.2.0
  4. Советы по использованию pandas groupby на примерах
  5. Применение операций к группам в pandas – Chris Albon