pandas groupby и agg: группировка по двум столбцам

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

Что означает одна строка результата

При группировке по магазину и категории результат содержит строку на каждую встреченную пару ключей. Именованный агрегат записывается как имя=("столбец", "функция"). Параметр as_index=False оставляет ключи обычными столбцами.

Отдельно выбирайте способ подсчёта: count считает непустые значения выбранного столбца, size — строки группы. Для дальнейшего объединения с другой таблицей заранее проверьте уникальность группового ключа.

Пример на других данных

import pandas as pd
df = pd.DataFrame({"shop": ["A", "A", "B"],
                   "category": ["tea", "tea", "tea"], "revenue": [20, 40, 15]})
report = df.groupby(["shop", "category"], as_index=False).agg(
    total=("revenue", "sum"), average=("revenue", "mean"))
print(report["total"].tolist())
print(report["average"].tolist())

Результат:

[60, 15]
[30.0, 15.0]

Попробуйте сами

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

Два ключа, четыре агрегата: groupby по region и channel с as_index=False

Что уже дано

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

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

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

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит четыре токена через пробел: region (строка без пробелов), channel (строка без пробелов), amount (целое число), orders (целое число). Пример строки: Север online 5000 10.
  3. Создаёт pd.DataFrame из словаря списков с ключами 'region', 'channel', 'amount', 'orders'.
  4. Группирует DataFrame по ['region', 'channel'] с as_index=False и вычисляет за один вызов agg четыре именованных агрегата:
  • total_amount=('amount', 'sum')
  • avg_amount=('amount', 'mean')
  • max_orders=('orders', 'max')
  • tx_count=('orders', 'count')

Сохраняет результат в переменную result.
5. Выводит в stdout:

  • строку columns=<список> — list(result.columns) в виде Python-списка;
  • строку shape=<кортеж> — result.shape;
  • для каждой строки result, отсортированной по 'region', затем по 'channel', выводит одну строку вида <region> <channel> <total_amount> <avg_amount> <max_orders> <tx_count>, где avg_amount округлён до двух знаков после запятой.

Ввод и вывод

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

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

Формат ввода

n
region1 channel1 amount1 orders1
region2 channel2 amount2 orders2
...

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

columns=['region', 'channel', 'total_amount', 'avg_amount', 'max_orders', 'tx_count']
shape=(<строк>, 6)
<region> <channel> <total_amount> <avg_amount> <max_orders> <tx_count>
...

Пример

Ввод
6
Север online 5000 10
Север offline 3000 6
Юг online 4000 8
Юг offline 2000 4
Север online 1000 2
Юг online 500 1
Вывод
columns=['region', 'channel', 'total_amount', 'avg_amount', 'max_orders', 'tx_count']
shape=(4, 6)
Север offline 3000 3000.0 6 1
Север online 6000 3000.0 10 2
Юг offline 2000 2000.0 4 1
Юг online 4500 2250.0 8 2
РешениеPython

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

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

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