Функция rank() в pandas: ранжирование значений

Series.rank() присваивает каждому значению его ранг (порядковый номер по величине). Параметр method определяет, что делать с равными значениями: 'dense' — плотные ранги без пропусков, 'min' — как SQL RANK с пропусками, 'first' — по порядку появления. Внутри групп ранжируют через df.groupby(...).rank() — это pandas-аналог оконного RANK/DENSE_RANK.

Синтаксис

df['col'].rank(method='dense', ascending=False)

Примеры использования

Пример 1: Плотный ранг заказов внутри клиента

df['rnk'] = df.groupby('user_id')['amount'].rank(method='dense', ascending=False)

Результат:

   user_id  amount  rnk
0        1     900  1.0
1        1     500  2.0

Пример 2: Ранг по убыванию с method=min (как SQL RANK)

df['amount'].rank(method='min', ascending=False)

Результат:

(ничьи делят ранг, следующий пропускается)
Порешать Python-задачи в тренажёре →

Типичная ошибка

rank возвращает float (даже целые ранги — 1.0, 2.0) — приведи к int через .astype(int), если нужно. method по умолчанию 'average' (усредняет ранги ничьих, даёт дробные вроде 1.5) — для «топ-N» это редко нужно, чаще берут 'dense', 'min' или 'first'. Для ранга внутри группы обязателен groupby, иначе ранжирование пойдёт по всему df.

Где спрашивают на собеседовании

rank спрашивают как pandas-эквивалент оконных RANK/DENSE_RANK/ROW_NUMBER: «топ-N внутри группы», «второй по величине». Ценят знание разницы method (dense/min/first) и связки groupby().rank() для ранга внутри группы.

FAQ: частые вопросы про rank

Какой method выбрать в rank?

'dense' — плотные ранги (1,1,2), как SQL DENSE_RANK. 'min' — с пропусками (1,1,3), как RANK. 'first' — уникальные по порядку появления, как ROW_NUMBER. По умолчанию 'average' даёт дробные ранги ничьих.

Как ранжировать внутри группы?

df.groupby('ключ')['значение'].rank(...) — ранги считаются отдельно в каждой группе. Это pandas-аналог RANK() OVER (PARTITION BY ...).

Почему rank возвращает дробные числа?

По умолчанию method='average' усредняет ранги для одинаковых значений (два первых места дают 1.5, 1.5). Возьми method='dense'/'min'/'first' для целых рангов.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas groupby · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →