pandas groupby: ранг и накопительная сумма по группам

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

Программа курса «NumPy и pandas: практический тренажёр».

Найди и исправь: три ошибки в cumsum и rank внутри группы

Что уже дано

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

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

  1. Столбец 'cum_sales' вычисляется через df['sales'].cumsum() до сортировки по 'month' — из-за этого накопление идёт не в хронологическом порядке. Нужно сначала отсортировать DataFrame по ['region', 'month'] через sort_values и сбросить индекс через reset_index(drop=True), а затем вызывать cumsum.

  2. Ранг внутри региона вычисляется через df['sales'].rank(method='min', ascending=False) — это глобальный ранг по всему DataFrame, а не внутри группы. Нужно заменить на df.groupby('region')['sales'].rank(method='min', ascending=False).

  3. Накопительная сумма считается через df['sales'].cumsum() вместо df.groupby('region')['sales'].cumsum() — накопление идёт по всему DataFrame, а не отдельно внутри каждого региона.

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

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

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

  1. Читала из stdin целое число n — количество строк.
  2. Читала следующие n строк; каждая содержит три токена через пробел: region (строка без пробелов), month (целое число), sales (целое число). Пример строки: Север 1 200.
  3. Создавала pd.DataFrame с именем df со столбцами 'region', 'month', 'sales'.
  4. Сортировала df по ['region', 'month'] через sort_values и сбрасывала индекс через reset_index(drop=True) до вычисления cumsum.
  5. Добавляла столбец 'rank_in_region' — ранг sales внутри каждого region по убыванию, method='min', через groupby + rank.
  6. Добавляла столбец 'cum_sales' — накопительную сумму sales внутри каждого region в текущем (уже отсортированном) порядке строк через groupby + cumsum.
  7. Выводила в stdout заголовок region month sales rank_in_region cum_sales, затем строки таблицы через пробел; rank_in_region выводить как целое число.

Ввод и вывод

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

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

Формат ввода

n
region1 month1 sales1
region2 month2 sales2
...

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

region month sales rank_in_region cum_sales
region1 month1 sales1 rr1 cs1
...

Пример

Ввод
6
Север 1 200
Юг 1 150
Север 2 300
Юг 2 400
Север 3 250
Юг 3 100
Вывод
region month sales rank_in_region cum_sales
Север 1 200 3 200
Север 2 300 1 500
Север 3 250 2 750
Юг 1 150 2 150
Юг 2 400 1 550
Юг 3 100 3 650
РешениеPython

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

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

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