pandas groupby и agg: именованные агрегаты и сортировка

groupby объединяет строки по ключам, а agg вычисляет показатели для каждой группы. В именованной агрегации название результата задаётся слева, а пара (столбец, функция) — справа. as_index=False оставляет ключи обычными столбцами.

Короткий пример

import pandas as pd
df = pd.DataFrame({"team": ["A", "A", "B"], "score": [3, 5, 2]})
report = df.groupby("team", as_index=False).agg(
    total=("score", "sum"), average=("score", "mean"))
report = report.sort_values("total", ascending=False)
print(report.to_dict("records"))

Результат:

[{'team': 'A', 'total': 8, 'average': 4.0}, {'team': 'B', 'total': 2, 'average': 2.0}]

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

Попробуйте самостоятельно

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

Документация.

Пайплайн: groupby + agg + rename + sort, затем группировка по двум ключам

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая:

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит четыре токена через пробел: month (строка без пробелов), category (строка без пробелов), amount (целое число), transactions (целое число). Пример строки: Jan Food 1200 12.
  3. Создаёт pd.DataFrame из словаря списков с ключами 'month', 'category', 'amount', 'transactions'.
  4. Шаг A. Группирует DataFrame по 'month' с as_index=False и вычисляет за один вызов agg три именованных агрегата: month_total=('amount', 'sum'), month_avg=('amount', 'mean'), month_tx=('transactions', 'sum'). Сохраняет в monthly.
  5. Шаг B. Переименовывает столбец 'month_total' в 'total' через rename(columns=...) и сохраняет результат обратно в monthly.
  6. Шаг C. Сортирует monthly по 'total' по возрастанию через sort_values. Выводит строку monthly_columns=<список> — list(monthly.columns), затем для каждой строки отсортированного monthly выводит одну строку вида <month> <total> <round(month_avg, 1)> <month_tx>.
  7. Шаг D. Группирует исходный DataFrame по ['month', 'category'] с as_index=False и вычисляет cat_total=('amount', 'sum'). Сохраняет в by_cat. Сортирует by_cat по 'month', затем по 'category'. Выводит строку by_cat_columns=<список>, затем для каждой строки выводит <month> <category> <cat_total>.

Ввод и вывод

Программа читает stdin и пишет в stdout.

Ограничения: n >= 1.

Формат ввода

n
month1 category1 amount1 transactions1
month2 category2 amount2 transactions2
...

Формат вывода

monthly_columns=['month', 'total', 'month_avg', 'month_tx']
<month> <total> <month_avg> <month_tx>
...
by_cat_columns=['month', 'category', 'cat_total']
<month> <category> <cat_total>
...

Пример

Ввод
8
Jan Food 1200 12
Jan Tech 3500 5
Feb Food 900 9
Feb Tech 4200 6
Jan Food 800 8
Feb Food 650 7
Jan Tech 2000 3
Feb Tech 1500 4
Вывод
monthly_columns=['month', 'total', 'month_avg', 'month_tx']
Feb 7250 1812.5 26
Jan 7500 1875.0 28
by_cat_columns=['month', 'category', 'cat_total']
Feb Food 1550
Feb Tech 5700
Jan Food 2000
Jan Tech 5500
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи