【Pandas】rank()

在 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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值