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. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinцелое числоn— количество строк таблицы. - Читает следующие
nстрок; каждая содержит три токена через пробел:region(строка без пробелов),manager(строка без пробелов),sales(целое число). Пример строки:Север Аня 200. - Создаёт
pd.DataFrameс именемdfиз словаря списков с ключами'region','manager','sales'. - Добавляет столбец
'region_avg'— среднееsalesпо каждомуregionдля каждой строки — черезdf.groupby('region')['sales'].transform('mean'). - Добавляет булев столбец
'above_avg'—True, еслиsalesданной строки строго большеregion_avg. Используйте векторное сравнение без циклов. - Выводит в
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)
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- groupby и transform: групповые признаки на уровне строк и фильтрация групп — задача по NumPy и pandas
- pandas transform count: фильтрация групп по числу строк
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
- Загрузка CSV с явными типами и датами через readcsv — задача по NumPy и pandas
- Загрузка CSV в pandas: dtype, usecols и разбор дат
