Коротко
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 — наименьшее значение получает ранг 1Truepctранг в долях от 0 до 1Falsena_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')