Применение нескольких функций к группам столбцов в Pandas
Быстрый ответ
Чтобы применить различные функции к нескольким столбцам DataFrame после группировки с использованием groupby
, вам необходимо подготовить словарь. Здесь ключами служат названия столбцов, а значениями – списки функций. Полученный словарь передаётся в метод agg()
для агрегации данных.
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' – максимальное и минимальное значения.
Обогатите свои возможности с помощью собственных функций
Стандартные функции замечательны, однако порой требуются более специфические варианты. В этом случае создавайте и используйте вашу собственную функцию.
def my_custom_agg(series):
return pd.Series({'CustomSum': series.sum(), 'CustomMean': series.mean()})
grouped_custom = df.groupby('Group')['Data1'].apply(my_custom_agg)
Создание собственной функции агрегации открывает новый уровень контроля над обработкой данных.
Применение лямбда-функций на ходу
Лямбда-функции — это компактный и удобный инструмент для обработки данных:
grouped_lambda = df.groupby('Group').agg({
'Data1': lambda x: x.max() – x.min(), # Диапазон значений.
'Data2': lambda x: sum(x > 250) # Количество значений выше 250.
})
Назовите функцию: использование именованных агрегатов
Начиная с версии pandas 0.25.0 появилась возможность применять именованные агрегации, улучшающие читаемость синтаксиса и организацию получаемых результатов:
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()
. Лучше отдавать предпочтение более линейным структурам или лямбда-функциям для написания чистого и надёжного кода.
Ситуация с взаимозависимыми группами
Если группы данных взаимозависимы, обработка данных усложняется:
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 всегда найдётся решение!
grouped_trick = df.groupby('Group').agg({
'Data1': lambda x: (x + df.loc[x.index, 'Data2']).mean()
})
Оставайтесь в курсе, регулярно обновляя свои знания
Быть опытным Python-разработчиком означает не только уметь писать код, но и постоянно чтение документации. Обновления могут внести существенные изменения!
Гибкое именование столбцов
В мире изменений названия столбцов также должны быть гибкими. Не забывайте использовать атрибут __name__
для динамизации именования столбцов.
Сокращаем итерацию вручную до минимума
Предпочтение отдавайте функциям .agg()
и .apply()
, без необходимости итерирования по группам вручную. Эффективность – это не универсальность, а способность адаптироваться к конкретным задачам.