Pandas CategoricalDtype: сортировка категорий и отчёт

Лексикографическая сортировка строк не обязана совпадать с деловым порядком категорий. Для уровней «низкий», «средний», «высокий» можно явно задать упорядоченный категориальный тип.

Проверьте состав категорий до преобразования: неизвестное значение может превратиться в пропуск. В этой задаче порядок уровней используется вместе с фильтрацией и расчётом показателя — все требования приведены в спецификации.

Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «NumPy и pandas: практический тренажёр».

Отчёт по уровням: категориальная сортировка, фильтрация и среднее

Что уже дано

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

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

Напишите программу, которая строит отчёт по сотрудникам с категориальной сортировкой.

  1. Читает из stdin целое число n — количество строк.
  2. Читает следующие n строк; каждая содержит три токена через пробел: name (строка без пробелов), level (одно из слов junior, middle, senior) и salary (целое число). Пример строки: Аня junior 60000.
  3. Строит pd.DataFrame с именем df из словаря списков с ключами 'name', 'level', 'salary'.
  4. Шаг A. Категориальный тип. Создаёт объект cat_dtype = pd.CategoricalDtype(categories=['junior', 'middle', 'senior'], ordered=True) и присваивает его столбцу 'level' через astype, сохраняя результат обратно в df['level'].
  5. Шаг B. Сортировка. Сортирует df по 'level' через df.sort_values('level') и сохраняет в df_sorted. Выводит значения столбца 'name' из df_sorted через пробел в одну строку.
  6. Шаг C. Фильтрация. Из df_sorted отбирает строки, где level не равен 'junior', через df_sorted.loc[df_sorted['level'] != 'junior']. Сохраняет в df_senior. Выводит df_senior.shape[0] — количество оставшихся строк.
  7. Шаг D. Среднее. Вычисляет среднее значение 'salary' для df_senior через .mean() и выводит его, округлив до двух знаков после запятой.
  8. Шаг E. Проверка dtype. Выводит str(df['level'].dtype) — должно быть category.

Ввод и вывод

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

Формат ввода

n
name1 level1 salary1
name2 level2 salary2
...

Дополнительные ограничения: n >= 1; среди строк есть хотя бы один сотрудник уровня middle или senior.

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

Четыре строки:

<имена через пробел в порядке категориальной сортировки>
<количество строк df_senior>
<среднее salary df_senior, округлённое до 2 знаков>
<dtype столбца level>

Пример

Ввод
6
Аня junior 60000
Боря senior 120000
Вера middle 85000
Гена junior 55000
Даша senior 130000
Егор middle 90000
Вывод
Аня Гена Вера Егор Боря Даша
4
106250.0
category
РешениеPython

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

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

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