rank() 默认用"average"方法处理并列值,相同值取所占位置的平均秩,如[10,20,20,40]→[1.0,2.5,2.5,4.0];空值默认排末尾且秩为NaN,返回浮点型结果。

rank() 函数默认怎么处理并列值?
rank() 在 pandas 中默认使用 "average" 方法处理并列:相同值会获得它们占据位置的平均秩。比如 [10, 20, 20, 40] 的排名是 [1.0, 2.5, 2.5, 4.0] —— 两个 20 占据第 2 和第 3 位,所以都得 2.5。
- 这是多数统计场景的合理默认,但容易被误认为“错了”,尤其当你期望得到 [1, 2, 2, 4] 或 [1, 2, 3, 4] 时
-
rank()不修改原数据,返回的是Series或DataFrame同形状的浮点型秩数组 - 注意:空值(
NaN)默认排在末尾且不参与计数,秩为NaN;可通过na_option="top"或"bottom"调整
如何让并列值取最小/最大/首个出现的秩?
用 method 参数切换并列策略:
-
method="min":并列值取最小秩 → [10, 20, 20, 40] → [1, 2, 2, 4] -
method="max":并列值取最大秩 → [1, 3, 3, 4] -
method="first":按出现顺序给唯一秩 → [1, 2, 3, 4](哪怕值相等) -
method="dense":并列后不跳过后续秩 → [1, 2, 2, 3],适合分段连续编号
df["score_rank"] = df["score"].rank(method="min", ascending=False) 是常见反向排名写法,比如按分数降序排,最高分得 1。
升序、降序和空值控制必须显式指定
rank() 默认 ascending=True,即小值排前面(如成绩低者名次靠前),这和日常“排名越高越好”直觉相反。实际业务中几乎总要加 ascending=False。
立即学习“Python免费学习笔记(深入)”;
-
na_option控制NaN如何参与排序:"keep"(保持NaN秩为NaN,默认)、"top"(排第 1)、"bottom"(排最后) -
numeric_only=True可强制跳过非数值列(避免TypeError: rank does not support strings) - 若对整个
DataFrame调用rank(),需指定axis=0(按列)或axis=1(按行),否则报错
为什么 rank() 返回 float 而不是 int?
因为 "average" 方法天然产生小数(如并列三人得 (2+3+4)/3 = 3.0,但两人并列第二就是 2.5),pandas 统一用 float64 表示所有秩以保精度。
- 如果你确定不会出现平均情况(比如用了
method="min"且无NaN),可用.astype("int64")转整型,但要注意:一旦有NaN,int类型不支持,必须用Int64(首字母大写)可空整型 - 直接
.astype(int)遇到NaN会转成-2147483648这类幻数,务必避开
并列逻辑不是“选一个方法就行”,而是要对照业务含义——是希望并列者共享名次(average)、还是占坑不跳(min)、还是强行错开(first)。参数组合稍有偏差,下游分组、分位、TopN 就可能出错。


















