在 pandas 处理数据时,rank() 通过设置 method 参数,可以达到与 SQL里窗口函数:row_number() / rank() / dense_rank()同样的功能。史博:【数据分析】- SQL必做常见面试50题(1/2)保姆级
def rank(self: NDFrameT,
axis: Any = 0, # Series 默认为0
method: str = "average", # 如何对具有相同值的一组记录进行排序
numeric_only: bool | None | NoDefault = lib.no_default,
na_option: str = "keep", # ‘keep’, ‘top’, ‘bottom’ NaN 排的位置
ascending: bool = True,
pct: bool = False) -> NDFrame # 默认 %.5f
一、参数 method
SQL里的规则:
1 .rank()“同考了80分的两位同学,分别并列第一。后续考了79分的考生自动成为第三名(产生名次间隙);
2. dense_rank()“同考80分的两位同学,分别并列第一。后续考79分的考生成为第二名(不产生名次间隙);
3. row_number()“同考80分的两位同学,随机排序(序号为1、2排名不分先后)。后续考生名次继续递增;
分别对应 Python 里:method =" min" / "dense" / "first"(ascending=False)
import pandas as pd
df = pd.DataFrame({"Students": ['张', '栗', '汪', '赵', '钱', '孙'], "Scores": [80, 79, 78, 78, 80, 59]})
df["min"] = df['Scores'].rank(method="min", ascending=False) # sql:rank()
df["dense"] = df['Scores'].rank(method="dense", ascending=False) # sql:dense_rank()
df["first"] = df['Scores'].rank(method="first", ascending=False) # sql:row_number() ,按正逆序排布后,出现的先后顺序
print(df)
method 主要是对于相同记录如何输出的规定。另外两个如下:
method = "max" ( highest rank in the group)两个数值按对应序号的均值输出。
method = "average" ( average rank in the group)两个数值按最大排名的序号输出。即在first排序结果的基础上,数值相同时,两个数值都按最大序号输出
二、参数 pct
pct = 默认是False,是否以百分位形式显示返回的排名。
df = pd.DataFrame({"Students": ['张', '栗', '汪', '赵', '钱', '孙'], "Scores": [80, 79, 78, 78, 80, 59]})
df["dense"] = df["Scores"].rank(method="dense",ascending=False)
df["pct"] = df["Scores"].rank(ascending=False,pct=True) # 建立在dense基础上比较容易理解
print(df)
pct
如果改变 method,pct的结果也会跟着改变。尝试了下,不写 method 时,比较匹配 dense 的排名:排名最高的 pct = 1,其他排名的 pct,直接用“序号/最大序号“得到pct的值。
至于这个有什么用,不太清楚,欢迎留言交流。
参考链接
pandas.Series.rank - pandas 2.0.2 documentation
Python数据分析-pandas的rank函数助你轻松实现排序功能_python中rank函数怎么用_TheLittlePython的博客-CSDN博客