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. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinцелое числоn— количество строк таблицы. - Читает следующие
nстрок; каждая содержит четыре токена через пробел:region(строка без пробелов),channel(строка без пробелов),amount(целое число),orders(целое число). Пример строки:Север online 5000 10. - Создаёт
pd.DataFrameиз словаря списков с ключами'region','channel','amount','orders'. - Группирует 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
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- groupby и agg: сводные показатели с явными именами агрегатов — задача по NumPy и pandas
- pandas groupby и agg: именованные агрегаты и сортировка
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
- Загрузка CSV с явными типами и датами через readcsv — задача по NumPy и pandas
- Загрузка CSV в pandas: dtype, usecols и разбор дат
