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

groupby и agg: сводные показатели с явными именами агрегатов

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

Найди и исправь: три ошибки в groupby, agg и reset_index

Что уже дано

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

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

  1. В первой группировке используется groupby('dept', as_index=True), хотя нужно получить плоскую таблицу с 'dept' как обычным столбцом — нужен as_index=False.
  2. В именованном агрегате avg_bonus=('bonus', 'mean') исходный столбец написан как 'salary' вместо 'bonus' — среднее считается не по тому столбцу.
  3. Вторая группировка вычисляет total_bonus=('bonus', 'sum'), но после .agg(...) не вызван .reset_index(), из-за чего 'dept' и 'name' остаются индексом, а не столбцами.

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

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

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

  1. Читала из stdin целое число n — количество строк таблицы.
  2. Читала следующие n строк; каждая содержит четыре токена через пробел: dept (строка), name (строка), salary (целое число), bonus (целое число).
  3. Строила pd.DataFrame с именем df и столбцами 'dept', 'name', 'salary', 'bonus'.
  4. Выполняла первую группировку по 'dept' с as_index=False и вычисляла за один agg три агрегата:
  • total_sal=('salary', 'sum')
  • avg_bonus=('bonus', 'mean') ← исходный столбец должен быть 'bonus', не 'salary'
  • head_count=('name', 'count')

Сохраняла в summary. Выводила list(summary.columns), затем каждую строку summary, отсортированную по 'dept', в формате <dept> <total_sal> <avg_bonus> <head_count>.

  1. Выполняла вторую группировку по ['dept', 'name'] без as_index=False и вычисляла total_bonus=('bonus', 'sum'), затем вызывала .reset_index(). Сохраняла в by_person. Выводила list(by_person.columns), затем каждую строку by_person, отсортированную по 'dept', потом по 'name', в формате <dept> <name> <total_bonus>.

Ввод и вывод

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

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

Формат ввода

n
dept1 name1 salary1 bonus1
dept2 name2 salary2 bonus2
...

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

['dept', 'total_sal', 'avg_bonus', 'head_count']
<dept> <total_sal> <avg_bonus> <head_count>
...
['dept', 'name', 'total_bonus']
<dept> <name> <total_bonus>
...
О данных в ответах

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

Проверяется тестами (1)
  • Тест 1
    Ввод
    6
    HR Алиса 70000 6000
    HR Боря 75000 8000
    IT Вера 100000 12000
    IT Гена 110000 13000
    IT Даша 95000 11000
    HR Егор 80000 9000
    
    Ожидаемый вывод
    ['dept', 'total_sal', 'avg_bonus', 'head_count']
    HR 225000 7666.666666666667 3
    IT 305000 12000.0 3
    ['dept', 'name', 'total_bonus']
    HR Алиса 6000
    HR Боря 8000
    HR Егор 9000
    IT Вера 12000
    IT Гена 13000
    IT Даша 11000
    
Решение
Как проверяется решение

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

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