pandas groupby transform: среднее группы для каждой строки

groupby(...).transform("mean") в pandas возвращает групповое среднее для каждой исходной строки. В отличие от agg, transform сохраняет длину результата и связь с индексом исходной таблицы.

Когда нужен transform

Если нужно сравнить продажу с обычным уровнем её магазина, одной строки на магазин недостаточно: среднее требуется рядом с каждой продажей. transform позволяет добавить такой признак без промежуточного merge.

agg используйте для отдельного сводного отчёта по группам. transform — для признака на уровне исходных строк, например отклонения от среднего или доли в сумме группы. Перед делением на групповой показатель проверьте нулевые значения.

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

import pandas as pd
df = pd.DataFrame({"shop": ["A", "A", "B"], "sales": [10, 30, 8]})
df["shop_mean"] = df.groupby("shop")["sales"].transform("mean")
print(df["shop_mean"].tolist())
print((df["sales"] > df["shop_mean"]).tolist())

Результат:

[20.0, 20.0, 8.0]
[False, True, False]

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

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

Флаг «выше среднего по региону»: transform('mean') и векторное сравнение

Что уже дано

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

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

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

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит три токена через пробел: region (строка без пробелов), manager (строка без пробелов), sales (целое число). Пример строки: Север Аня 200.
  3. Создаёт pd.DataFrame с именем df из словаря списков с ключами 'region', 'manager', 'sales'.
  4. Добавляет столбец 'region_avg' — среднее sales по каждому region для каждой строки — через df.groupby('region')['sales'].transform('mean').
  5. Добавляет булев столбец 'above_avg' — True, если sales данной строки строго больше region_avg. Используйте векторное сравнение без циклов.
  6. Выводит в stdout ровно n + 2 строк:
  • Строки 1…n: для каждой строки (в исходном порядке) одну строку вида <manager> <region_avg_rounded_to_1> <above_avg>, где region_avg округлён до одного знака после запятой, above_avg — True или False.
  • Строка n+1: above_count: <k> — число строк, где above_avg равен True (через df['above_avg'].sum()).
  • Строка n+2: shape: <shape> — кортеж df.shape.

Ввод и вывод

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

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

Формат ввода

n
region1 manager1 sales1
...
regionN managerN salesN

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

manager1 region_avg1 above_avg1
...
managerN region_avgN above_avgN
above_count: <k>
shape: (<n>, <cols>)

Пример

Ввод
8
Север Аня 200
Юг Боря 150
Север Вера 300
Восток Гена 100
Юг Даша 250
Восток Егор 180
Север Жора 220
Юг Зина 90
Вывод
Аня 240.0 False
Боря 163.3 False
Вера 240.0 True
Гена 140.0 False
Даша 163.3 True
Егор 140.0 True
Жора 240.0 False
Зина 163.3 False
above_count: 3
shape: (8, 5)
РешениеPython

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

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

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