【Pandas】pandas DataFrame rank

Pandas2.2 DataFrame

Computations descriptive stats

方法描述
DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值
DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 True
DataFrame.any(*[, axis, bool_only, skipna])用于判断 DataFrame 中是否至少有一个元素在指定轴上为 True
DataFrame.clip([lower, upper, axis, inplace])用于截断(限制)DataFrame 中的数值
DataFrame.corr([method, min_periods, …])用于计算 DataFrame 中各列之间的相关系数矩阵(Correlation Matrix)
DataFrame.corrwith(other[, axis, drop, …])用于计算当前 DataFrame 的每一列(或行)与另一个 Series 或 DataFrame 中对应列的相关系数
DataFrame.count([axis, numeric_only])用于统计 DataFrame 中每列或每行的非空(非 NaN)元素数量
DataFrame.cov([min_periods, ddof, numeric_only])用于计算 DataFrame 中每对列之间的协方差
DataFrame.cummax([axis, skipna])用于计算 DataFrame 中每列或每行的累计最大值(cumulative maximum)
DataFrame.cummin([axis, skipna])用于计算 DataFrame 中每列或每行的累计最小值(cumulative minimum)
DataFrame.cumprod([axis, skipna])用于计算 DataFrame 中每列或每行的累计乘积(cumulative product)
DataFrame.cumsum([axis, skipna])用于计算 DataFrame 中每列或每行的累计和(cumulative sum)
DataFrame.describe([percentiles, include, …])用于快速生成数据集的统计摘要(summary statistics)
DataFrame.diff([periods, axis])用于计算 DataFrame 中相邻行或列之间的差值(差分)
DataFrame.eval(expr, *[, inplace])用于在 DataFrame 上下文中高效地执行字符串形式的表达式运算
DataFrame.kurt([axis, skipna, numeric_only])用于计算 DataFrame 中每列或每行的峰度(Kurtosis)
DataFrame.kurtosis([axis, skipna, numeric_only])用于计算 DataFrame 中每列或每行的峰度(Kurtosis)
DataFrame.max([axis, skipna, numeric_only])用于计算 DataFrame 中每列或每行的最大值(maximum)
DataFrame.mean([axis, skipna, numeric_only])用于计算 DataFrame 中每列或每行的平均值(mean)
DataFrame.median([axis, skipna, numeric_only])用于计算 DataFrame 中每列或每行的中位数(median)
DataFrame.min([axis, skipna, numeric_only])用于计算 DataFrame 中每列或每行的最小值(minimum)
DataFrame.mode([axis, numeric_only, dropna])用于查找 众数(出现频率最高的值) 的方法
DataFrame.pct_change([periods, fill_method, …])用于计算 百分比变化 的方法
DataFrame.prod([axis, skipna, numeric_only, …])用于计算 每列或每行元素的乘积 的方法
DataFrame.product([axis, skipna, …])用于计算 DataFrame 中每列或每行所有元素的乘积
DataFrame.quantile([q, axis, numeric_only, …])用于计算 分位数(Quantiles) 的方法
DataFrame.rank([axis, method, numeric_only, …])用于计算 DataFrame 中每列或每行元素的排名(rank)

pandas.DataFrame.rank()

pandas.DataFrame.rank() 方法用于计算 DataFrame 中每列或每行元素的排名(rank),即根据数值大小为每个元素分配一个排序位置。它支持多种排名方式,如平均排名、最小/最大排名等,并可控制缺失值的处理方式和排序方向。


📌 方法签名:
DataFrame.rank(axis=0, method='average', numeric_only=False, na_option='keep', ascending=True, pct=False)

🧾 参数说明:
参数类型默认值描述
axis{0/‘index’, 1/‘columns’}, 默认 0
  • 0'index':按列计算排名(默认)
  • 1'columns':按行计算排名 |
    | method | str | 'average' | 当有重复值时的排名方法:
    - 'average': 平均排名
    - 'min': 最小排名(并列取最小)
    - 'max': 最大排名(并列取最大)
    - 'first': 按出现顺序排名
    - 'dense': 紧密排名(不跳过排名) |
    | numeric_only | bool | False | 是否只考虑数值类型列(int、float),忽略布尔、字符串等非数值列 |
    | na_option | {‘keep’, ‘top’, ‘bottom’} | 'keep' | 控制 NaN 值的排名方式:
    - 'keep': 保留 NaN,其排名为 NaN
    - 'top': 将 NaN 视为最大值(升序时排最后)
    - 'bottom': 将 NaN 视为最小值(升序时排最前) |
    | ascending | bool | True | 排名是否升序(True 表示从小到大;False 表示从大到小) |
    | pct | bool | False | 是否返回百分位排名(True 表示 0~1 的比例形式) |

📊 返回值
  • 返回一个新的 DataFrame,形状与原 DataFrame 相同,表示每个元素在其所在行或列中的排名。
  • 若某列为非数值类型且未设置 numeric_only=True,则该列不会参与排名并可能抛出错误。

✅ 示例及结果
示例数据:
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [3, 1, 2],
    'B': [10, 5, 10],
    'C': [np.nan, 4, 4],
    'D': ['a', 'b', 'c']  # 非数值列
})

输出原始数据:

   A   B     C  D
0  3  10   NaN  a
1  1   5   4.0  b
2  2  10   4.0  c

示例 1:默认参数(按列计算排名,使用 average 方法)
df.rank()

结果:

     A    B    C
0  3.0  2.0  NaN
1  1.0  1.0  1.5
2  2.0  2.0  1.5

解释:

  • 列 A:[3, 1, 2] → 排名分别为 3, 1, 2
  • 列 B:两个 10 → 使用 'average' 方法,它们的排名是 (1+2)/2 = 1.5 和 1.5
  • 列 C:NaN 被保留(na_option='keep'
  • 列 D 抛出错误(不是数值列)

示例 2:设置 method='min'(最小排名法)
df[['A', 'B', 'C']].rank(method='min')

结果:

     A    B    C
0  3.0  2.0  NaN
1  1.0  1.0  1.0
2  2.0  2.0  1.0

解释:

  • 列 B 中两个 10 的排名都为 1(最小排名)
  • 列 C 中两个 4 的排名也都是 1(最小排名)

示例 3:设置 na_option='bottom'(将 NaN 排名为最小)
df[['A', 'B', 'C']].rank(na_option='bottom')

结果:

     A    B    C
0  3.0  2.0  3.0
1  1.0  1.0  1.5
2  2.0  2.0  1.5

解释:

  • NaN 在列 C 中被视为最小值,因此排名为 3(升序下排在最后)

示例 4:设置 ascending=False(降序排名)
df[['A', 'B', 'C']].rank(ascending=False)

结果:

     A    B    C
0  1.0  1.5  NaN
1  3.0  3.0  2.5
2  2.0  1.5  2.5

解释:

  • 列 A:3 是最大 → 排名 1
  • 列 B:两个 10 是最大 → 排名 1.5(平均排名)

示例 5:设置 pct=True(返回百分位排名)
df[['A', 'B', 'C']].rank(pct=True)

结果:

     A         B    C
0  1.0  0.666667  NaN
1  0.333333  0.333333  0.5
2  0.666667  0.666667  0.5

解释:

  • 百分位排名基于总个数进行归一化(如 3 个元素对应 1/3、2/3、3/3)

示例 6:按行计算排名(axis=1
df[['A', 'B', 'C']].rank(axis=1, method='dense')

结果:

   A  B    C
0  3  1  NaN
1  1  3    2
2  1  3    2

解释:

  • 第0行:3(A)、10(B)、NaN(C) → 排名分别为 3、1(最大值),C 为 NaN
  • 第1行:1(A)、5(B)、4(C) → 排名分别为 1、3、2

示例 7:结合 numeric_only=True 忽略非数值列
df.rank(numeric_only=True)

结果:

     A    B    C
0  3.0  2.0  NaN
1  1.0  1.0  1.5
2  2.0  2.0  1.5

解释:

  • 字符串列 D 被自动忽略

示例 8:使用 method='dense' 进行紧密排名
df[['A', 'B', 'C']].rank(method='dense')

结果:

     A    B    C
0  3.0  2.0  NaN
1  1.0  1.0  1.0
2  2.0  2.0  1.0

解释:

  • 紧密排名,即使有重复值也不会跳过后续排名

⚠️ 注意事项
  • 只适用于数值型列(int、float),除非设置 numeric_only=True
  • 支持处理 NaN 值(通过 na_option 控制排名方式)
  • 多种排名方法可用于不同场景(如比赛排名、统计排名等)
  • 不影响原始 DataFrame,返回新对象

🎯 适用场景
场景描述
特征工程构造排名特征,如“历史排名”、“相对位置”
数据分析分析变量的相对大小关系
可视化准备准备排名数据用于图表展示
模型评估计算预测值的排名误差(Ranking Loss)

📋 总结
特性描述
功能计算 DataFrame 中每个元素在其列或行中的排名
默认行为按列计算,使用平均排名法,保留 NaN
是否修改原数据否,返回新 DataFrame
适用类型数值型列(int、float)
输出范围浮点数(取决于排名方式)

rank() 是一个非常实用的方法,适合用于构造排名特征、分析变量相对位置、可视化准备等任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuweidong0802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值