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

groupby(...).rank() вычисляет ранг отдельно внутри каждой группы. При ascending=False большее значение получает меньший номер; method="min" присваивает равным значениям одинаковый минимальный ранг, оставляя пропуски в нумерации.

Почему перед cumsum важен порядок строк

groupby(...).cumsum() суммирует значения в текущем порядке строк внутри группы. Если нужен итог от большей величины к меньшей, сначала выполните sort_values, а затем cumsum. Сам groupby не сортирует строки внутри каждой группы по числовому значению.

Пример на других данных

import pandas as pd
df = pd.DataFrame({"team": ["A", "A", "B"], "sales": [10, 30, 20]})
print(df.groupby("team")["sales"].rank(method="min", ascending=False).tolist())
ordered = df.sort_values(["team", "sales"], ascending=[True, False])
print(ordered.groupby("team")["sales"].cumsum().tolist())

Результат:

[2.0, 1.0, 1.0]
[30, 40, 20]

Решите задачу

Ниже — условие и редактор Python с проверкой без регистрации. Пример выше показывает приём на других данных; для задачи соблюдайте её формат ввода и результата. Курс NumPy и pandas помогает пройти темы по порядку.

Турнир по регионам: глобальный ранг, ранг внутри региона и накопительные очки

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

Что уже дано

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

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

Напишите программу, которая:

  1. Читает из stdin целое число n — количество участников.
  2. Читает следующие n строк; каждая содержит три токена через пробел: name (строка без пробелов), region (строка без пробелов), points (целое число). Пример строки: Даша Север 100.
  3. Создаёт pd.DataFrame из словаря списков с ключами 'name', 'region', 'points'.
  4. Добавляет столбец rank_global — ранг каждого участника среди всех строк по убыванию points, method='min'.
  5. Добавляет столбец rank_in_region — ранг каждого участника внутри своего региона по убыванию points, method='min'.
  6. Сортирует DataFrame сначала по region (по возрастанию), затем по points (по убыванию) через sort_values. Сбрасывает индекс через reset_index(drop=True).
  7. Добавляет столбец cum_points — накопительную сумму points внутри каждого region в текущем порядке строк через groupby('region')['points'].cumsum().
  8. Выводит в stdout заголовок и строки таблицы. Формат:
  • первая строка: name region points rank_global rank_in_region cum_points
  • каждая следующая строка: значения соответствующих столбцов через пробел; rank_global и rank_in_region выводить как целые числа.

Ввод и вывод

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

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

Формат ввода

n
name1 region1 points1
name2 region2 points2
...

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

name region points rank_global rank_in_region cum_points
name1 region1 points1 rg1 rr1 cp1
...

Пример

Ввод
6
Даша Север 100
Аня Север 80
Вера Север 80
Боря Юг 95
Егор Юг 85
Гена Юг 70
Вывод
name region points rank_global rank_in_region cum_points
Даша Север 100 1 1 100
Аня Север 80 4 2 180
Вера Север 80 4 2 260
Боря Юг 95 2 1 95
Егор Юг 85 3 2 180
Гена Юг 70 6 3 250
РешениеPython

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

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

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