Применение двух функций к одному столбцу в pandas

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

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

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

Для выполнения множественного агрегирования одного столбца в DataFrame из библиотеки pandas, воспользуйтесь методом GroupBy.agg(). Ему следует передать словарь, где ключами будут названия столбцов, а значениями — список функций агрегации:

Python
Скопировать код
agg_result = df.groupby('key')['value'].agg({
    'total': 'sum',   # Суммируем значения
    'average': 'mean',  # Вычисляем среднее
    'peak': 'max'  # Находим максимум
})

В результате вы получите DataFrame с колонками total, average и peak для столбца 'value' каждого уникального ключа.

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

Упростим процесс с pandas >= 0.25

С версии pandas 0.25 доступен удобный синтаксис именованного агрегирования, который делает код более читаемым:

Python
Скопировать код
agg_result = df.groupby('key').agg(
    total=pd.NamedAgg(column='value', aggfunc='sum'),
    average=pd.NamedAgg(column='value', aggfunc='mean'),
    peak=pd.NamedAgg(column='value', aggfunc='max')
)

Оба приведенных примера выполняют одно и то же, но благодаря классу NamedAgg второй вариант выглядит нагляднее.

Нестандартная агрегация: почему бы и нет?

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

Python
Скопировать код
agg_result = df.groupby('key')['value'].agg({
    'range': lambda x: x.max() – x.min(),   # Вычисляем размах
    'variance': lambda x: x.var()  # И дисперсию
})

Таким подходом можно определить диапазон и вариативность для каждой группы, не прибегая к использованию новых функций.

Учитываем версионные различия: версия pandas важна

Стоит помнить, что ваш код может исполняться на различных версиях pandas, и с течением времени синтаксис может изменяться. Следите за предупреждениями об устаревшем коде и стремитесь писать устойчивый код.

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

Множественное агрегирование одного столбца в DataFrame можно ассоциировать с выбором различных блюд в буфете:

Markdown
Скопировать код
   +------ Столбец 'value' ------+
   |                             |
   | [🥘] Сумма     =>  💰           |
   | [🍚] Среднее  =>  📈           |
   | [🥗] Максимум =>  🚀           |
   | [🍣] Своё      =>  🧪          |
   |                             |
   +-----------------------------+

Используя pandas, вы можете "отведать" эти гастрономические "вкусы":

Python
Скопировать код
df.groupby('key')['value'].agg([
    ('💰', 'sum'), 
    ('📈', 'mean'), 
    ('🚀', 'max'),
    ('🧪', lambda x: x.median() – x.mean())  # Еще один пользовательский вариант
])

Теперь в вашем DataFrame представлены разные виды агрегаций. Приятного "проглатывания" данных!

Сохранение оригинального группового индекса

Если вы не хотите, чтобы столбец группировки стал индексом, используйте параметр as_index=False:

Python
Скопировать код
df.groupby('key', as_index=False)['value'].agg(
    Mean=('value', 'mean'),
    Range=lambda x: x.max() – x.min()  # Здесь вычисляется диапазон
)

Таким образом, вы получите DataFrame, где ключ группировки останется отдельным столбцом.

Приведение в порядок столбцов MultiIndex

После именованной агрегации столбцы DataFrame могут образовывать структуру MultiIndex. Привести её в порядок можно следующим образом:

Python
Скопировать код
result = df.groupby('key').agg(
    Mean=pd.NamedAgg(column='value', aggfunc='mean'),
    Sum=pd.NamedAgg(column='value', aggfunc='sum')
)
result.columns = ['_'.join(col).strip() for col in result.columns.values]  # Теперь структура порядка столбцов прозрачна и понятна

Эффективное программирование с использованием цепей методов

Цепочки методов позволяют писать чистый и эффективный код:

Python
Скопировать код
(df
.groupby('key', as_index=False)
.agg(mean_value=('value', 'mean'), sum_value=('value', 'sum'))
.assign(ratio=lambda x: x['sum_value'] / x['mean_value'])
)

Последовательное применение методов позволяет избавиться от необходимости во временных переменных и делает код более сжатым.

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

  1. pandas.DataFrame.groupby — исследуйте возможности метода groupby, заглянув в документацию.
  2. pandas GroupBy — подробная статья о применении метода groupby.
  3. Aggregation and Grouping — узнайте о тонкостях агрегации данных.
  4. pandas.DataFrame.agg — подробное описание метода agg.
  5. Применение нескольких функций — обсуждение множественного применения функций в groupby.
  6. Овладение pandas GroupBy — глубокий разбор возможностей pandas GroupBy для эффективного анализа данных.