Функция Rank в Pandas: Ранжирование данных в Dataframe (Эквивалент SQL row_number)
Функция rank в Pandas может использоваться для ранжирования данных и является эквивалентом функции SQL ROW_NUMBER. В этом уроке вы узнаете, как использовать функцию rank, включая ранжирование всего датафрейма или отдельных столбцов. Вы изучите, как использовать различные параметры функции rank в Pandas. Это позволит вам изменять порядок ранжирования и обрабатывать равные значения в их ранжировании. Вы также узнаете, как ранжировать датафрейм Pandas в сочетании с группированными данными. Вы пройдете практический пример того, как выбрать только строки с наибольшими значениями в группировке.
Краткий ответ: Функция .rank()
в Pandas для ранжирования данных
# Понимание метода Pandas .rank()
import pandas as pd
df.rank(
axis=0, # Ранжировать столбцы / строки
method='average', # Как ранжировать дублирующиеся значения
numeric_only=True, # Ранжировать только числовые столбцы
na_option='keep', # Как ранжировать пропущенные данные
ascending=True, # В каком порядке ранжировать
pct=False # Ранжировать в нормализованном виде или нет
)
Оглавление
Понимание метода ранжирования Pandas
Метод .rank()
в Pandas очень похож на оконную функцию ROW_NUMBER(), встречающуюся в SQL. Он позволяет вам ранжировать данные различными способами. На первый взгляд функция выглядит довольно простой. Однако, за внешней простотой скрывается много сложностей, и в этой статье мы их все исследуем.
Давайте рассмотрим базовый синтаксис метода rank в Pandas, чтобы увидеть, какие аргументы
import pandas as pd
df.rank(
axis=0, # Ранжировать столбцы / строки (0 - столбцы, 1 - строки)
method='average', # Как ранжировать дублирующиеся значения ('average', 'min', 'max', 'first', 'dense')
numeric_only=True, # Ранжировать только числовые столбцы
na_option='keep', # Как ранжировать пропущенные данные ('keep', 'top', 'bottom')
ascending=True, # В каком порядке ранжировать (True - по возрастанию, False - по убыванию)
pct=False # Ранжировать в нормализованном виде или нет (True - в процентах, False - в виде рангов)
)
Давайте разберем эти аргументы немного подробнее, чтобы понять, как мы можем использовать их для получения желаемых результатов при ранжировании наших данных:
axis=
: определяет, по какому индексу направлять ранжирование (по строкам или столбцам)method=
: как ранжировать группы записей, которые имеют одинаковое значениеnumeric_only=
: если весь датафрейм ранжируется, указывает, включать ли только числовые столбцы или нет.na_option=
: как ранжировать значенияпо возрастанию=
: должны ли элементы упорядочиваться по возрастанию или нетpct=
: отображать ли возвращаемые рейтинги в процентной форме (т.е., нормализовать рейтинги до значения 1)
Здесь видно, что метод Pandas .rank()
предлагает большую гибкость, предоставляя множество значений по умолчанию для аргументов, что обеспечивает общую согласованность
Одним из очень интересных аргументов является аргумент method=
, который предоставляет нам несколько вариантов, как обрабатывать дубликаты значений (т.е. «связанные» значения). Например, мы можем захотеть присвоить этим значениям одинаковый ранг или взять их среднее значение. В следующем разделе мы подробно рассмотрим это, чтобы вы могли получить нужный результат.
Начнем с загрузки примера фрейма данных Pandas, чтобы помочь следовать инструкциям.
Загрузка образца Pandas Dataframe
Если вы хотите следовать за этим руководством построчно, не стесняйтесь загрузить пример Pandas dataframe ниже. Если у вас есть собственный dataframe, чтобы следить за процессом, это тоже отлично!
Давайте посмотрим, как выглядит наш датафрейм, сначала загрузив его, а затем выводим первые пять записей с помощью метода .head()
датафрейма.
# Загрузка примера DataFrame Pandas для учебника
import pandas as pd
# Создание DataFrame из словаря
df = pd.DataFrame.from_dict({
'Name': ['Nik', 'Kate', 'Evan', 'Kyra', 'Piet', 'Maya'], # Имена
'Count': [100, 100, 105, 95, 75, 150], # Количество
'Score': [22, 33, 11, 55, 77, 99] # Оценки
})
# Вывод первых 5 строк DataFrame
print(df.head())
# Результат:
# Name Count Score
# 0 Nik 100 22
# 1 Kate 100 33
# 2 Evan 105 11
# 3 Kyra 95 55
# 4 Piet 75 77
Наш датафрейм имеет три столбца: один со строковыми значениями и два с числовыми. Теперь, когда у нас есть датафрейм для работы, давайте начнем ранжировать наши данные!
Хотите узнать, как использовать функцию zip()
в Python для итерации по двум спискам? Этот учебник объясняет, что делает функция zip()
, и предлагает несколько творческих способов её использования.
Базовый рейтинг вашего фреймворка данных Pandas
Самый простой способ применить .rank()
из Pandas ко всему DataFrame с аргументами по умолчанию.
Посмотрим, что произойдет, когда мы сделаем это с нашим датафреймом, df:
# Ранжирование всего DataFrame
ranked = df.rank() # Применение метода rank() ко всему DataFrame
print(ranked) # Вывод ранжированного DataFrame
# Результат:
# Name Count Score
# 0 5.0 3.5 2.0
# 1 2.0 3.5 3.0
# 2 1.0 5.0 1.0
# 3 3.0 1.5 NaN
# 4 6.0 1.5 4.0
# 5 4.0 6.0 5.0
В приведённом выше примере мы применили метод .rank()
ко всему нашему датафрейму. Давайте посмотрим, что произошло в результате:
Строковый столбец был отсортирован по алфавиту в порядке возрастания.
Отсутствующие значения рассматриваются как NaN, что означает, что они фактически игнорируются при ранжировании.
Эквивалентные элементы ранжируются методом «среднего», что означает, что значения рангов усредняются.
Теперь давайте посмотрим, как можно ранжировать только один столбец. **Метод Pandas .rank()
разработан таким образом, что возвращает тот же тип, что и объект, вызвавший метод – это означает, что метод вернет DataFrame, если передан DataFrame, и Series (или столбец), если передан Series.
Теперь давайте посмотрим, как можно передать только один столбец и как на самом деле происходит ранжирование. Мы создадим новый столбец Score_Ranked
, который предоставит ранжирование для столбца Score
. Давайте посмотрим,
# Ранжирование только одного столбца в Pandas
df['Score_Ranked'] = df['Score'].rank() # Создание нового столбца 'Score_Ranked' с рангами значений столбца 'Score'
print(df) # Вывод DataFrame с добавленным столбцом рангов
# Результат:
# Name Count Score Score_Ranked
# 0 Nik 100 22 2.0
# 1 Kate 100 33 3.0
# 2 Evan 105 11 1.0
# 3 Kyra 95 55 4.0
# 4 Piet 75 77 5.0
# 5 Maya 150 99 6.0
Здесь мы видим, что создается новый столбец, который предоставляет настройки по умолчанию для ранжирования столбца
В следующих разделах вы узнаете, как изменить аргументы метода .rank()
, чтобы изменить его поведение.
Pandas Rank Dataframe с обратным порядком сортировки
По умолчанию метод .rank()
в Pandas сортирует данные в порядке возрастания, что означает, что элементы с меньшими значениями будут иметь более низкий ранг (т. е. начиная с 1). Если вы хотите изменить это поведение и отсортировать значения в порядке убывания, мы можем установить параметр.
Давайте посмотрим, как это выглядит, когда мы ранжируем тот же столбец
# Изменение порядка ранжирования DataFrame Pandas
df['Score_Ranked_Asc'] = df['Score'].rank() # Ранжирование столбца 'Score' по возрастанию
df['Score_Ranked_Desc'] = df['Score'].rank(ascending=False) # Ранжирование столбца 'Score' по убыванию
print(df) # Вывод DataFrame с двумя новыми столбцами рангов
# Результат:
# Name Count Score Score_Ranked Score_Ranked_Asc Score_Ranked_Desc
# 0 Nik 100 22 2.0 2.0 5.0
# 1 Kate 100 33 3.0 3.0 4.0
# 2 Evan 105 11 1.0 1.0 6.0
# 3 Kyra 95 55 4.0 4.0 3.0
# 4 Piet 75 77 5.0 5.0 2.0
# 5 Maya 150 99 6.0 6.0 1.0
В следующем разделе вы узнаете, как ранжировать равные элементы различными методами, используя аргумент.
Pandas ранжирует Dataframe разными методами
Не редкость, когда данные содержат одинаковые значения. Обычно это не вызывает проблем, но когда вы используете Pandas для ранжирования данных, одинаковым значениям нужно задать порядок сортировки. В этом случае аргумент method=
пригодится.
Метод rank
в Pandas имеет аргумент method=
, который принимает несколько различных опций. Давайте кратко рассмотрим их:
«среднее»: средний ранг группы (например, если две величины находятся на 7-м месте, им будет присвоено значение 7,5)
«min»: возвращает наименьший ранг в группе и присваивает его каждому значению.
«max»: возвращает наивысший ранг в группе и присваивает его каждому значению.
«первый»: ранги присваиваются в порядке их появления в датафрейме.
«dense»: аналогичен методу «min», но ранг всегда увеличивается на 1
На первый взгляд, эти значения могут показаться не самыми интуитивно понятными. Самый простой способ понять их — это создать рейтинги для каждого метода.
Давайте создадим Pandas dataframe с каждым методом ранжирования, чтобы лучше изучить аргумент.
# Изучение различных методов обработки дубликатов при ранжировании
df['Count_average'] = df['Count'].rank(method='average') # Ранжирование с использованием среднего значения для дубликатов
df['Count_min'] = df['Count'].rank(method='min') # Ранжирование с использованием минимального значения для дубликатов
df['Count_max'] = df['Count'].rank(method='max') # Ранжирование с использованием максимального значения для дубликатов
df['Count_first'] = df['Count'].rank(method='first') # Ранжирование с использованием порядка появления для дубликатов
df['Count_dense'] = df['Count'].rank(method='dense') # Ранжирование без пропуска рангов для дубликатов
print(df) # Вывод DataFrame с новыми столбцами рангов
# Результат:
# Name Count Score Score_Ranked Score_Ranked_Asc Score_Ranked_Desc \
# 0 Nik 100 22 2.0 2.0 5.0
# 1 Kate 100 33 3.0 3.0 4.0
# 2 Evan 105 11 1.0 1.0 6.0
# 3 Kyra 95 55 4.0 4.0 3.0
# 4 Piet 75 77 5.0 5.0 2.0
# 5 Maya 150 99 6.0 6.0 1.0
# Count_average Count_min Count_max Count_first Count_dense
# 0 3.5 3.0 4.0 3.0 3.0
# 1 3.5 3.0 4.0 4.0 3.0
# 2 5.0 5.0 5.0 5.0 4.0
# 3 2.0 2.0 2.0 2.0 2.0
# 4 1.0 1.0 1.0 1.0 1.0
# 5 6.0 6.0 6.0 6.0 5.0
В приведенном выше примере датафрейма мы можем увидеть нюансы различных методов ранжирования данных.
В следующем разделе вы узнаете, как ранжировать данные в группе.
Pandas Rank Dataframe с Groupby (группированные рейтинги)
Отличное применение метода Pandas .rank()
заключается в возможности его применения к группе. Это имеет множество практических применений, таких как возможность выбора наименьшего или наибольшего значения за определённый день.
Для этого примера давайте загрузим другой датафрейм
# Загрузка другого примера DataFrame
import pandas as pd
# Создание DataFrame из словаря
df = pd.DataFrame.from_dict({
'Date': ['2021-12-01', '2021-12-01', '2021-12-01', '2021-12-02', '2021-12-02'], # Даты продаж
'Salesperson': ['Nik', 'Kate', 'Evan', 'Nik', 'Kate'], # Имена продавцов
'Sales': [100, 105, 110, 95, 130] # Объемы продаж
})
print(df) # Вывод DataFrame
# Результат:
# Date Salesperson Sales
# 0 2021-12-01 Nik 100
# 1 2021-12-01 Kate 105
# 2 2021-12-01 Evan 110
# 3 2021-12-02 Nik 95
# 4 2021-12-02 Kate 130
Давайте посмотрим, как мы можем сгруппировать наши данные по дате и затем ранжировать по столбцу "
# Ранжирование столбца на основе группировки другого столбца в Pandas
import pandas as pd
# Создание DataFrame из словаря
df = pd.DataFrame.from_dict({
'Date': ['2021-12-01', '2021-12-01', '2021-12-01', '2021-12-02', '2021-12-02'], # Даты продаж
'Salesperson': ['Nik', 'Kate', 'Evan', 'Nik', 'Kate'], # Имена продавцов
'Sales': [100, 105, 110, 95, 130] # Объемы продаж
})
# Ранжирование столбца 'Sales' по группам дат, в порядке убывания
df['Sales Ranked by Date'] = df.groupby('Date')['Sales'].rank(ascending=False)
print(df) # Вывод DataFrame с новым столбцом рангов
# Результат:
# Date Salesperson Sales Sales Ranked by Date
# 0 2021-12-01 Nik 100 3.0
# 1 2021-12-01 Kate 105 2.0
# 2 2021-12-01 Evan 110 1.0
# 3 2021-12-02 Nik 95 2.0
# 4 2021-12-02 Kate 130 1.0
Это более сложный пример – давайте разберём, что мы сделали здесь:
Мы добавили новый столбец для ранжирования наших продаж по дате
Этот столбец основывается на группировке наших данных сначала по Дате, а затем выбором только столбца Продажи.
Затем мы ранжируем этот результирующий сгруппированный столбец в порядке убывания.
Из этого легко выбрать лучшего продавца по дате, отфильтровав наш dataframe Pandas. Чтобы узнать больше о выборе данных в Pandas, ознакомьтесь с моим руководством здесь.
Давайте посмотрим, как мы можем
# Выбор только верхних значений группировки
df['Sales Ranked by Date'] = df.groupby('Date')['Sales'].rank(ascending=False) # Ранжирование продаж по датам, по убыванию
df = df[df['Sales Ranked by Date'] == 1.0] # Фильтрация DataFrame, оставляя только строки с рангом 1.0 (наивысшие продажи в каждой группе)
print(df) # Вывод отфильтрованного DataFrame
# Результат:
# Date Salesperson Sales Sales Ranked by Date
# 2 2021-12-01 Evan 110 1.0
# 4 2021-12-02 Kate 130 1.0
При фильтрации Pandas DataFrame мы можем легко увидеть лучшего продавца по дате
В следующем разделе вы узнаете, как выполнить ранжирование вашего датафрейма Pandas с использованием процентов, что означает нормализованное ранжирование.
Pandas Rank Dataframe с процентами (нормализованные рейтинги)
Ещё одно замечательное свойство метода .rank()
в Pandas заключается в том, что мы можем нормализовать наши рейтинги до значений между 0 и 1. Хотя это может показаться незначительным, оно позволяет сравнивать минимальные и максимальные рейтинги в разных столбцах, даже если в них различное количество уникальных значений.
Мы можем применить нормализованную версию ранжирования с помощью аргумента pct=
. Давайте посмотрим, как мы можем применить это в Python и Pandas:
# Ранжирование DataFrame с использованием нормализованных рангов
df = df.rank(pct=True) # Ранжирование DataFrame с использованием процентных рангов (нормализация)
print(df) # Вывод DataFrame с нормализованными рангами
# Результат:
# Name Count Score
# 0 0.833333 0.583333 0.4
# 1 0.333333 0.583333 0.6
# 2 0.166667 0.833333 0.2
# 3 0.500000 0.250000 NaN
# 4 1.000000 0.250000 0.8
# 5 0.666667 1.000000 1.0
Мы видим, что ранги всех столбцов не превышают 1. Когда мы изменяем другие параметры, как показано выше, мы можем изменять шаг через схожие значения.
В последнем разделе ниже вы узнаете, как сортировать только числовые столбцы в датафрейме Pandas.
Pandas ранжирует только числовые столбцы в Dataframe
При ранжировании всего датафрейма вы можете захотеть исключить ранжирование нечисловых столбцов. Это связано с тем, что ранжирование на основе алфавитной сортировки не имеет такого же значения, как ранжирование числовых столбцов.
Давайте посмотрим, как мы можем использовать аргумент numeric_only=
, чтобы ранжировать только числовые столбцы
# Ранжирование только числовых столбцов с помощью Pandas .rank()
df = df.rank(numeric_only=True) # Ранжирование только числовых столбцов DataFrame
print(df) # Вывод DataFrame с ранжированными числовыми столбцами
# Результат:
# Count Score
# 0 3.5 2.0
# 1 3.5 3.0
# 2 5.0 1.0
# 3 1.5 NaN
# 4 1.5 4.0
# 5 6.0 5.0
Мы можем видеть, что когда мы просим Pandas ранжировать только числовые столбцы, он не возвращает ни один из нечисловых столбцов.
Заключение
В этом руководстве вы научились использовать метод .rank()
для ранжирования данных в Pandas. Вы узнали, как ранжировать отдельный столбец или весь датафрейм. Вы также узнали, как изменить порядок сортировки и как ранжировать с использованием различных методов, включая нормализованное ранжирование (пропорциональное из 1). Наконец, вы узнали, как ранжировать датафрейм Pandas, когда данные сгруппированы с помощью метода .groupby()
, а также как ограничить ранжирование только числовыми столбцами.
Чтобы узнать больше о методе .rank()
в Pandas, ознакомьтесь с официальной документацией здесь.
Last updated