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