pandas: индекс, сортировка и reindex с заполнением новых строк

set_index назначает индекс из столбца, sort_values сортирует строки по значениям, а reindex приводит результат к заданному набору и порядку меток. Если требуемая метка отсутствует, появляется новая строка с пропусками или значением fill_value.

Короткий пример

import pandas as pd
df = pd.DataFrame({"team": ["b", "a"], "score": [2, 9]})
ranked = df.set_index("team").sort_values("score", ascending=False)
print(ranked.index.tolist())
print(ranked.reindex(["a", "c"], fill_value=0)["score"].tolist())

Результат:

['a', 'b']
[9, 0]

fill_value заполняет новые места, созданные reindex; он не заменяет все уже существующие пропуски исходной таблицы. При сортировке по нескольким столбцам задайте приоритет ключей и направление каждого.

Попробуйте самостоятельно

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

Документация.

Рейтинг отделов: set_index, sort_values по двум ключам и reindex с fill_value

Что уже дано

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

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

Напишите программу, которая выполняет четыре операции над таблицей отделов:

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит три токена через пробел: dept (строка без пробелов), head_count (целое число), budget (целое число). Пример строки: Sales 12 500000.
  3. Строит pd.DataFrame из словаря списков с ключами 'dept', 'head_count', 'budget'.
  4. Шаг A. set_index. Назначает столбец 'dept' индексом. Сохраняет в df2. Выводит одну строку: shape=<df2.shape> columns=<list(df2.columns)>.
  5. Шаг B. sort_values. Сортирует df2 сначала по 'budget' по убыванию, затем при равенстве по 'head_count' по возрастанию. Сохраняет в df3. Выводит одну строку: top_dept=<df3.index[0]>.
  6. Шаг C. reindex. Читает из stdin последнюю строку — список меток через пробел (new_order). Вызывает df3.reindex(new_order, fill_value=0) и сохраняет в df4. Выводит одну строку: budget_sum=<int(df4['budget'].sum())>.
  7. Шаг D. Выводит одну строку: missing_rows=<число строк в df4 с head_count равным 0> — это строки, добавленные reindex для отсутствующих меток.

Ввод и вывод

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

Формат ввода

n
dept1 head_count1 budget1
...
deptN head_countN budgetN
мет1 мет2 ... метK

Последняя строка — метки для reindex через пробел. Некоторые метки могут отсутствовать в исходном DataFrame.

Дополнительные ограничения: n >= 1; значения dept попарно различны; head_count >= 1.

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

Ровно четыре строки в порядке шагов A–D:

shape=<shape> columns=<list>
top_dept=<строка>
budget_sum=<целое число>
missing_rows=<целое число>

Пример

Ввод
4
Sales 12 500000
HR 5 200000
IT 20 800000
Legal 8 200000
IT Sales Finance HR
Вывод
shape=(4, 2) columns=['head_count', 'budget']
top_dept=IT
budget_sum=1500000
missing_rows=1
РешениеPython

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

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

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