Нашли ошибку?
среднийpandas 3.0.6

Ранги

Место каждого значения в упорядоченном списке — с выбором, что делать с одинаковыми значениями.

Нужно знать:Сортировка

Содержание статьи

Коротко

  • rank() ставит каждому значению место: наименьшее получает 1. ascending=False — наибольшее получает 1.
  • Порядок строк не меняется — в отличие от сортировки.
  • Для равных значений method: "average" — средний ранг (3.5), "min" — как в спорте (оба третьи, следующий пятый), "dense" — без пропусков (следующий четвёртый), "first" — по порядку появления.
  • pct=True — ранг как доля от 0 до 1.
  • В группах — groupby("group")["col"].rank().
  • Ранги — float, для целых мест добавьте .astype(int).

Синтаксис

s.rank(method="average", ascending=True, pct=False, na_option="keep")
df.groupby("g")["col"].rank(method="min")

Параметры

ПараметрЧто делаетПо умолчанию
method"average", "min", "max", "first", "dense""average"
ascendingTrue — наименьшее значение получает ранг 1True
pctранг в долях от 0 до 1False
na_option"keep" — у NaN ранг NaN, "top" / "bottom" — поставить в начало или конец"keep"

Примеры

Данные для примеровиспользуются во всех примерах ниже
race = pd.DataFrame({
    "runner": ["Аня", "Борис", "Вика", "Глеб", "Дина"],
    "group": ["A", "B", "A", "B", "A"],
    "time": [52.1, 49.8, 52.1, 55.0, 50.3],      # меньше — лучше
})
Ранги по умолчанию
race["time"].rank()                     # у равных — средний ранг (3.5)
Вывод
0    3.5
1    1.0
2    3.5
3    5.0
4    2.0
Name: time, dtype: float64
Как обработать равные значения
pd.DataFrame({
    "time": race["time"],
    "average": race["time"].rank(),
    "min": race["time"].rank(method="min"),
    "dense": race["time"].rank(method="dense"),
    "first": race["time"].rank(method="first"),
})
Вывод
   time  average  min  dense  first
0  52.1      3.5  3.0    3.0    3.0
1  49.8      1.0  1.0    1.0    1.0
2  52.1      3.5  3.0    3.0    4.0
3  55.0      5.0  5.0    4.0    5.0
4  50.3      2.0  2.0    2.0    2.0
Места в забеге
race.assign(place=race["time"].rank(method="min").astype(int)).sort_values(["place", "runner"])
Вывод
  runner group  time  place
1  Борис     B  49.8      1
4   Дина     A  50.3      2
0    Аня     A  52.1      3
2   Вика     A  52.1      3
3   Глеб     B  55.0      5
Ранг в долях
race["time"].rank(pct=True)             # доля участников не хуже
Вывод
0    0.7
1    0.2
2    0.7
3    1.0
4    0.4
Name: time, dtype: float64
Ранги внутри групп
race.assign(place_in_group=race.groupby("group")["time"].rank(method="min"))
Вывод
  runner group  time  place_in_group
0    Аня     A  52.1             2.0
1  Борис     B  49.8             1.0
2   Вика     A  52.1             2.0
3   Глеб     B  55.0             2.0
4   Дина     A  50.3             1.0

Подводные камни

Ранги — дробные числа

Даже с method="min" результат имеет тип float, потому что у "average" бывают дроби и тип один на все методы.

Тип рангов
race["time"].rank(method="min").dtype   # ранги — float, даже целые
Вывод
dtype('float64')