Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер
Всем привет, меня зовут Питер~
В нашей жизни мы часто сталкиваемся с различными проблемами ранжирования: рейтинг успеваемости студентов, рейтинг продаж, различные рейтинги конкурентов и т. д. В предыдущей статье о SQL — «Основы интервью: ранжирование SQL и оконные функции» я упомянул, как использовать SQL для достижения 3 основных методов ранжирования: последовательное ранжирование, ранжирование с переходом и плотное ранжирование.
Pandas, мощная библиотека анализа данных, также может быстро реализовать различные методы ранжирования, в основном с помощью функции ранжирования.Эта статья объяснит на нескольких примерах.
Параметр ранга
Ниже приведены основные параметры ранговой функции:
DataFrame.rank(axis=0,
method='average',
numeric_only=None,
na_option='keep',
ascending=True,
pct=False)
Конкретное объяснение параметров:
- ось: указывает, на какой оси основано ранжирование, ось = 0 указывает на горизонтальную ось, ось = 1 указывает на вертикальную ось
- метод: значение может быть "среднее", "первое", "минимальное", "максимальное", "плотное"; фокус будет введен позже, значение по умолчанию - среднее
- numeric_only: считать ли только числовые столбцы
- na_option: Участвует ли значение NaN в ранжировании и как его ранжировать, значения сохраняются, верхние, нижние
- по возрастанию: по возрастанию или по убыванию; по умолчанию - по возрастанию
- pct: отображать ли рейтинг в процентах от рейтинга; процент от всех рейтингов и наибольший рейтинг
В этой статье объясняется использование функции ранжирования в типах данных Series и DataFrame.
Рейтинг серии
import pandas as pd
import numpy as np
Сначала мы моделируем простые данные:
метод параметра
1. Метод ранжирования по умолчанию = "средний":
2. метод = "первый"
Значения ранжируются в соответствии с порядком их появления в исходных данных, а ранжирование одного и того же значения увеличивается на 1:
Объясните два приведенных выше результата:
- во-первых: ранжировать непосредственно в соответствии с числовым порядком величины
- среднее: означает, что если два значения одинаковы, ранжирование является их средним
Мы видим, что использование первого — это ранг, в котором значения появляются в естественном порядке, в случае использования среднего объяснение следующее:
-5 имеет рейтинг 1,0, 0 имеет рейтинг 2,0, 3 имеет рейтинг 3,0, 5 (позиция индекса 3) имеет рейтинг 4,0, 5 (позиция индекса 6) имеет рейтинг 5,0, 8 (позиция индекса 0) имеет рейтинг 6,0 и 8 (индекс 2) 7.0
За счет использования среднего значения ранжирования с таким же значением будет исключенозначит, рейтинг 5 объединен в 4,5, а рейтинг 8 объединен в 6,5
3. Использование максимума и минимума
Например, когда: method= "max": Если значения совпадают, берется ранг с наибольшим значением. Например, наибольший ранг числа 5 равен 5, поэтому ранжирование двух пятерок в исходных данных равно 5; ранжирование двух восьмерок равно 7 (два ранга 8 равны 6 и 7, в зависимости от того, какое значение больше 7).
4. метод = "плотный"
Одно и то же значение ранжируется одинаково, ранжирование следующего значениянет прыжка
В настоящее время не будет прыжков при ранжировании.
параметр по возрастанию
По умолчанию используется восходящий порядок, вы можете использовать нисходящий: чем больше значение, тем выше рейтинг:
Ранжирование 8 в значении, если метод = "первый", ранжирование равно 1 и 2, если используется среднее значение, ранжирование станет 1,5; другие числовые ранжирования аналогичны. Давайте снова посмотрим на случай max:
параметр проц
Отображать ли рейтинги в процентах от рейтинга; процент от всех рейтингов и наибольший рейтинг
Как рассчитываются приведенные выше рейтинги? Наш самый большой ранг — 7:
В другом примере параметр pct в случае плотности аналогичен:
Параметр na_option
Этот параметр указывает, участвует ли в ранжировании значение null, а значения — keep, top, bottom. Давайте смоделируем другие данные с нулевыми значениями:
Посмотрите на 3 разные ситуации:
Ранжирование DataFrame
Данные моделирования
Или сначала смоделируйте данные:
df0 = pd.DataFrame({"科目":["语文","语文","语文","语文","语文","数学","数学","数学","数学","数学"],
"姓名":["小明","小苏","小周","小孙","小王","小明","小苏","小周","小孙","小王"],
"分数":[137,125,125,115,115,80,111,130,130,140]})
df = df0.copy() # 生成一个副本df
df
Индивидуальный предметный рейтинг
Например, мы хотим увидеть рейтинг по китайскому языку и взять баллы учеников по китайскому языку:
Используйте последовательное ранжирование, ранжирование с переходом и плотное ранжирование, чтобы показать ситуацию ранжирования:
# 默认排名方式
df1["均值排名_默认"] = df1["分数"].rank(ascending=False)
df1["跳跃排名_min"] = df1["分数"].rank(method="min",ascending=False)
df1["跳跃_max"] = df1["分数"].rank(method="max",ascending=False)
df1["密集排名_dense"] = df1["分数"].rank(method="dense",ascending=False)
df1
Рейтинг студентов по общему баллу
Сначала сгенерируйте общий балл каждого ученика с помощью преобразования:
df["总分"] = df.groupby("姓名")["分数"].transform("sum")
df
Мы ранжируем общий балл, используя плотное ранжирование:
Группа для получения указанного рейтинга
Теперь мы видим учащегося, занявшего второе место по каждому предмету, и если оценки одинаковые, один и тот же ранг (без скачков), мы используем плотное ранжирование:
# 定义一个排名第二的函数
def rank_second(x):
return x[x["分数"].rank(method="dense",ascending=False) == 2]
Посмотрим на второго ученика по каждому предмету в реальных данных:
Настроенная выше функция второго ранга разделена на два этапа;
1. Сначала достигните интенсивного рейтинга
2. Указанный ранг равен 2
Когда мы используем эту пользовательскую функцию, нам нужно сначала сгруппировать по предметам, а затем использовать эту пользовательскую функцию в каждой группе отдельно, чтобы получить второе место по каждому предмету.
Суммировать
После объяснения использования функции rank ее можно сравнить с оконной функцией в SQL:
- row_number: последовательное ранжирование, метод=первый в функции ранжирования
- ранг: рейтинг прыжков, метод=мин в функции ранга
- плотное ранжирование: плотное ранжирование, method=dense в функции ранжирования
Наконец, официальный адрес обучения функции ранга прилагается, и вам нужно посмотреть на официальный сайт: