Метод rank
Метод rank применяется к объекту GroupBy
и возвращает ранги элементов внутри каждой группы.
Ранжирование выполняется независимо для каждой группы,
что позволяет сравнивать позиции элементов внутри группировки.
Метод поддерживает различные методы ранжирования,
способы обработки пропущенных значений и параметры сортировки.
Основное назначение - присвоение порядковых номеров
элементам на основе их значений внутри группы.
Синтаксис
df.groupby(by).rank(
method='average',
ascending=True,
na_option='keep',
pct=False,
numeric_only=False
)
Основные параметры метода:
-
method- способ ранжирования. Возможные значения: 'average', 'min', 'max', 'first', 'dense'. По умолчанию 'average' - средний ранг для одинаковых значений. -
ascending- определяет порядок ранжирования. ЕслиTrue, то наименьшему значению присваивается ранг 1. ЕслиFalse, то наибольшему значению присваивается ранг 1. По умолчаниюTrue. -
na_option- способ обработки пропущенных значений. Возможные значения: 'keep', 'top', 'bottom'. По умолчанию 'keep' - пропуски сохраняются какNaN. -
pct- еслиTrue, возвращает процентили (ранги, нормированные от 0 до 1). По умолчаниюFalse. -
numeric_only- еслиTrue, применяет ранжирование только к числовым столбцам. По умолчаниюFalse.
Пример
Давайте создадим таблицу с группами и вычислим ранги внутри каждой группы со стандартным методом 'average':
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B'],
'value': [10, 20, 10, 30, 20, 30]
})
df['rank'] = df.groupby('group')['value'].rank()
print(df)
Результат выполнения кода:
group value rank
0 A 10 1.5
1 A 20 3.0
2 A 10 1.5
3 B 30 2.5
4 B 20 1.0
5 B 30 2.5
Пример
Теперь вычислим ранги с методом 'min', который присваивает минимальный ранг для всех одинаковых значений:
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B'],
'value': [10, 20, 10, 30, 20, 30]
})
df['rank'] = df.groupby('group')['value'].rank(method='min')
print(df)
Результат выполнения кода:
group value rank
0 A 10 1.0
1 A 20 3.0
2 A 10 1.0
3 B 30 2.0
4 B 20 1.0
5 B 30 2.0
Пример
Используем метод 'dense', который присваивает ранги без пропусков между группами одинаковых значений:
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B'],
'value': [10, 20, 10, 30, 20, 30]
})
df['rank'] = df.groupby('group')['value'].rank(method='dense')
print(df)
Результат выполнения кода:
group value rank
0 A 10 1.0
1 A 20 2.0
2 A 10 1.0
3 B 30 2.0
4 B 20 1.0
5 B 30 2.0
Пример
Изменим порядок ранжирования на убывающий, чтобы наибольшее значение получало ранг 1:
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B'],
'value': [10, 20, 10, 30, 20, 30]
})
df['rank'] = df.groupby('group')['value'].rank(ascending=False)
print(df)
Результат выполнения кода:
group value rank
0 A 10 2.5
1 A 20 1.0
2 A 10 2.5
3 B 30 1.5
4 B 20 3.0
5 B 30 1.5
Пример
Вычислим процентили (нормированные ранги от 0 до 1) внутри каждой группы:
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B'],
'value': [10, 20, 10, 30, 20, 30]
})
df['pct_rank'] = df.groupby('group')['value'].rank(pct=True)
print(df)
Результат выполнения кода:
group value pct_rank
0 A 10 0.50
1 A 20 1.00
2 A 10 0.50
3 B 30 0.75
4 B 20 0.25
5 B 30 0.75
Пример
Применим ранжирование к нескольким столбцам таблицы одновременно:
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B'],
'x': [5, 8, 5, 9, 6, 9],
'y': [10, 20, 10, 30, 20, 30]
})
ranks = df.groupby('group').rank()
print(ranks)
Результат выполнения кода:
x y
0 1.5 1.5
1 3.0 3.0
2 1.5 1.5
3 2.5 2.5
4 1.0 1.0
5 2.5 2.5