pandas: группировки, соединения и упорядоченные показатели

groupby и transform: групповые признаки на уровне строк и фильтрация групп

Содержание курса

Найди и исправь: agg вместо transform и неверный порог фильтрации

Что уже дано

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

В редакторе уже есть сломанный код. В нём ровно три ошибки в трёх независимых строках:

  1. Столбец 'cat_total' вычисляется через df.groupby('category')['value'].agg('sum') — но agg возвращает Series с индексом из меток групп, поэтому при присваивании в df['cat_total'] все значения станут NaN. Нужно заменить agg на transform.
  2. Маска mask строится как df['cat_total'] >= threshold, хотя по условию нужно отбирать строки, где суммарное значение категории строго больше порога. Нужно заменить >= на >.
  3. Вывод числа отфильтрованных строк написан как print(len(df_filtered)), хотя по условию нужно вывести строку вида filtered: <k> (например, filtered: 3). Нужно исправить на print(f'filtered: {len(df_filtered)}').

Каждая ошибка находится в отдельной строке кода. Исправьте все три.

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

Исправьте три ошибки так, чтобы программа:

  1. Читала из stdin целое число n — количество строк таблицы.
  2. Читала следующие n строк; каждая содержит три токена через пробел: category (строка без пробелов), item (строка без пробелов), value (целое число).
  3. Создавала pd.DataFrame с именем df из словаря списков с ключами 'category', 'item', 'value'.
  4. Добавляла столбец 'cat_total' — суммарное значение value по каждой category для каждой строки — через transform('sum').
  5. Читала целое число threshold.
  6. Строила маску mask = df['cat_total'] > threshold и создавала df_filtered = df.loc[mask].
  7. Выводила ровно три блока:
  • Строку cat_total: <v1> <v2> ... <vN> — значения столбца 'cat_total' в порядке исходных строк через пробел.
  • Строку filtered: <k> — число строк в df_filtered.
  • Строку categories: <уникальные категории через пробел> — отсортированный список уникальных значений category в df_filtered.

Ввод и вывод

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

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

Формат ввода

n
category1 item1 value1
...
categoryN itemN valueN
threshold

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

cat_total: <v1> <v2> ... <vN>
filtered: <k>
categories: <cat1> <cat2> ...
О данных в ответах

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

Проверяется тестами (1)
  • Тест 1
    Ввод
    5
    X Laptop 300
    Y Phone 110
    X Monitor 300
    Y Tablet 110
    Z Cable 30
    200
    Ожидаемый вывод
    cat_total: 600 220 600 220 30
    filtered: 4
    categories: X Y
Решение
Как проверяется решение

Сравнение вывода: Правила исходной проверяющей системы. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

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