Функция Rank в Pandas: Ранжирование данных в Dataframe (Эквивалент SQL row_number)
Last updated
Last updated
Функция rank в Pandas может использоваться для ранжирования данных и является эквивалентом функции SQL ROW_NUMBER. В этом уроке вы узнаете, как использовать функцию rank, включая ранжирование всего датафрейма или отдельных столбцов. Вы изучите, как использовать различные параметры функции rank в Pandas. Это позволит вам изменять порядок ранжирования и обрабатывать равные значения в их ранжировании. Вы также узнаете, как ранжировать датафрейм Pandas в сочетании с группированными данными. Вы пройдете практический пример того, как выбрать только строки с наибольшими значениями в группировке.
Краткий ответ: Функция .rank()
в Pandas для ранжирования данных
Оглавление
Метод .rank()
в Pandas очень похож на оконную функцию ROW_NUMBER(), встречающуюся в SQL. Он позволяет вам ранжировать данные различными способами. На первый взгляд функция выглядит довольно простой. Однако, за внешней простотой скрывается много сложностей, и в этой статье мы их все исследуем.
Давайте рассмотрим базовый синтаксис метода rank в Pandas, чтобы увидеть, какие аргументы
Давайте разберем эти аргументы немного подробнее, чтобы понять, как мы можем использовать их для получения желаемых результатов при ранжировании наших данных:
axis=
: определяет, по какому индексу направлять ранжирование (по строкам или столбцам)
method=
: как ранжировать группы записей, которые имеют одинаковое значение
numeric_only=
: если весь датафрейм ранжируется, указывает, включать ли только числовые столбцы или нет.
na_option=
: как ранжировать значения
по возрастанию=
: должны ли элементы упорядочиваться по возрастанию или нет
pct=
: отображать ли возвращаемые рейтинги в процентной форме (т.е., нормализовать рейтинги до значения 1)
Здесь видно, что метод Pandas .rank()
предлагает большую гибкость, предоставляя множество значений по умолчанию для аргументов, что обеспечивает общую согласованность
Одним из очень интересных аргументов является аргумент method=
, который предоставляет нам несколько вариантов, как обрабатывать дубликаты значений (т.е. «связанные» значения). Например, мы можем захотеть присвоить этим значениям одинаковый ранг или взять их среднее значение. В следующем разделе мы подробно рассмотрим это, чтобы вы могли получить нужный результат.
Начнем с загрузки примера фрейма данных Pandas, чтобы помочь следовать инструкциям.
Если вы хотите следовать за этим руководством построчно, не стесняйтесь загрузить пример Pandas dataframe ниже. Если у вас есть собственный dataframe, чтобы следить за процессом, это тоже отлично!
Давайте посмотрим, как выглядит наш датафрейм, сначала загрузив его, а затем выводим первые пять записей с помощью метода .head()
датафрейма.
Наш датафрейм имеет три столбца: один со строковыми значениями и два с числовыми. Теперь, когда у нас есть датафрейм для работы, давайте начнем ранжировать наши данные!
Самый простой способ применить .rank()
из Pandas ко всему DataFrame с аргументами по умолчанию.
Посмотрим, что произойдет, когда мы сделаем это с нашим датафреймом, df:
В приведённом выше примере мы применили метод .rank()
ко всему нашему датафрейму. Давайте посмотрим, что произошло в результате:
Строковый столбец был отсортирован по алфавиту в порядке возрастания.
Отсутствующие значения рассматриваются как NaN, что означает, что они фактически игнорируются при ранжировании.
Эквивалентные элементы ранжируются методом «среднего», что означает, что значения рангов усредняются.
Теперь давайте посмотрим, как можно ранжировать только один столбец. **Метод Pandas .rank()
разработан таким образом, что возвращает тот же тип, что и объект, вызвавший метод – это означает, что метод вернет DataFrame, если передан DataFrame, и Series (или столбец), если передан Series.
Теперь давайте посмотрим, как можно передать только один столбец и как на самом деле происходит ранжирование. Мы создадим новый столбец Score_Ranked
, который предоставит ранжирование для столбца Score
. Давайте посмотрим,
Здесь мы видим, что создается новый столбец, который предоставляет настройки по умолчанию для ранжирования столбца
В следующих разделах вы узнаете, как изменить аргументы метода .rank()
, чтобы изменить его поведение.
По умолчанию метод .rank()
в Pandas сортирует данные в порядке возрастания, что означает, что элементы с меньшими значениями будут иметь более низкий ранг (т. е. начиная с 1). Если вы хотите изменить это поведение и отсортировать значения в порядке убывания, мы можем установить параметр.
Давайте посмотрим, как это выглядит, когда мы ранжируем тот же столбец
В следующем разделе вы узнаете, как ранжировать равные элементы различными методами, используя аргумент.
Не редкость, когда данные содержат одинаковые значения. Обычно это не вызывает проблем, но когда вы используете Pandas для ранжирования данных, одинаковым значениям нужно задать порядок сортировки. В этом случае аргумент method=
пригодится.
Метод rank
в Pandas имеет аргумент method=
, который принимает несколько различных опций. Давайте кратко рассмотрим их:
«среднее»: средний ранг группы (например, если две величины находятся на 7-м месте, им будет присвоено значение 7,5)
«min»: возвращает наименьший ранг в группе и присваивает его каждому значению.
«max»: возвращает наивысший ранг в группе и присваивает его каждому значению.
«первый»: ранги присваиваются в порядке их появления в датафрейме.
«dense»: аналогичен методу «min», но ранг всегда увеличивается на 1
На первый взгляд, эти значения могут показаться не самыми интуитивно понятными. Самый простой способ понять их — это создать рейтинги для каждого метода.
Давайте создадим Pandas dataframe с каждым методом ранжирования, чтобы лучше изучить аргумент.
В приведенном выше примере датафрейма мы можем увидеть нюансы различных методов ранжирования данных.
В следующем разделе вы узнаете, как ранжировать данные в группе.
Отличное применение метода Pandas .rank()
заключается в возможности его применения к группе. Это имеет множество практических применений, таких как возможность выбора наименьшего или наибольшего значения за определённый день.
Для этого примера давайте загрузим другой датафрейм
Давайте посмотрим, как мы можем сгруппировать наши данные по дате и затем ранжировать по столбцу "
Это более сложный пример – давайте разберём, что мы сделали здесь:
Мы добавили новый столбец для ранжирования наших продаж по дате
Этот столбец основывается на группировке наших данных сначала по Дате, а затем выбором только столбца Продажи.
Затем мы ранжируем этот результирующий сгруппированный столбец в порядке убывания.
Давайте посмотрим, как мы можем
При фильтрации Pandas DataFrame мы можем легко увидеть лучшего продавца по дате
В следующем разделе вы узнаете, как выполнить ранжирование вашего датафрейма Pandas с использованием процентов, что означает нормализованное ранжирование.
Ещё одно замечательное свойство метода .rank()
в Pandas заключается в том, что мы можем нормализовать наши рейтинги до значений между 0 и 1. Хотя это может показаться незначительным, оно позволяет сравнивать минимальные и максимальные рейтинги в разных столбцах, даже если в них различное количество уникальных значений.
Мы можем применить нормализованную версию ранжирования с помощью аргумента pct=
. Давайте посмотрим, как мы можем применить это в Python и Pandas:
Мы видим, что ранги всех столбцов не превышают 1. Когда мы изменяем другие параметры, как показано выше, мы можем изменять шаг через схожие значения.
В последнем разделе ниже вы узнаете, как сортировать только числовые столбцы в датафрейме Pandas.
При ранжировании всего датафрейма вы можете захотеть исключить ранжирование нечисловых столбцов. Это связано с тем, что ранжирование на основе алфавитной сортировки не имеет такого же значения, как ранжирование числовых столбцов.
Давайте посмотрим, как мы можем использовать аргумент numeric_only=
, чтобы ранжировать только числовые столбцы
Мы можем видеть, что когда мы просим Pandas ранжировать только числовые столбцы, он не возвращает ни один из нечисловых столбцов.
В этом руководстве вы научились использовать метод .rank()
для ранжирования данных в Pandas. Вы узнали, как ранжировать отдельный столбец или весь датафрейм. Вы также узнали, как изменить порядок сортировки и как ранжировать с использованием различных методов, включая нормализованное ранжирование (пропорциональное из 1). Наконец, вы узнали, как ранжировать датафрейм Pandas, когда данные сгруппированы с помощью метода .groupby()
, а также как ограничить ранжирование только числовыми столбцами.
Хотите узнать, как использовать функцию zip()
в Python для итерации по двум спискам? объясняет, что делает функция zip()
, и предлагает несколько творческих способов её использования.
Из этого легко выбрать лучшего продавца по дате, отфильтровав наш dataframe Pandas. Чтобы узнать больше о выборе данных в Pandas, .
Чтобы узнать больше о методе .rank()
в Pandas, .