stats.rankdata
stats.rankdata(即 scipy.stats.rankdata)是一个把原始数据转换成秩次(rank)的函数,常用于计算非参数统计量(如 Spearman ρ、Mann-Whitney U、Kruskal-Wallis H 等)之前的数据预处理。
📌 基本语法
from scipy.stats import rankdata
ranks = rankdata(a, method='average')
| 参数 | 含义 |
|---|---|
a |
一维数组或列表,待排序的数据 |
method |
遇到并列值(tie)时如何分配秩次,共 5 种策略(见下) |
🔍 method 选项
| method | 遇到并列值时的处理方式 | 示例(值 3 出现 2 次) |
|---|---|---|
'average' |
取平均秩次 | 2.5, 2.5 |
'min' |
取最小秩次 | 2, 2 |
'max' |
取最大秩次 | 3, 3 |
'dense' |
并列后下一个秩次仅+1 | 2, 2,然后下一个是 3 |
'ordinal' |
忽略并列,按出现顺序给秩次 | 2, 3 |
✅ 示例
from scipy.stats import rankdata
x = [10, 20, 20, 30]
print("average:", rankdata(x, method='average')) # [1. 2.5 2.5 4. ]
print("min :", rankdata(x, method='min')) # [1 2 2 4]
print("max :", rankdata(x, method='max')) # [1 3 3 4]
print("dense :", rankdata(x, method='dense')) # [1 2 2 3]
print("ordinal:", rankdata(x, method='ordinal')) # [1 2 3 4]
🎯 实战场景
1. 计算 Spearman 相关系数前先做秩转换
from scipy.stats import rankdata, spearmanr
x = [1, 2, 3, 4, 5]
y = [5, 6, 7, 8, 7]
# 等价于直接 spearmanr(x, y),但这里展示手动秩转换
rx = rankdata(x, method='average')
ry = rankdata(y, method='average')
rho, p = spearmanr(rx, ry)
print("Spearman ρ =", rho)
2. 处理缺失值
import numpy as np
x = [3, np.nan, 1, 2]
mask = ~np.isnan(x)
ranks_valid = rankdata(np.array(x)[mask])
print(ranks_valid) # [2. 1. 3.]
⚠️ 注意事项
- 输入必须是一维;二维数组请按行/列循环或用
np.apply_along_axis。 - 默认
method='average',与 R 的rank(..., ties.method = "average")一致。 - 若数据量很大且存在大量并列值,
method='dense'可节省内存(秩次连续)。
如果你有并列值很多或需要按列批量排名的场景,贴出代码片段,我可以帮你优化。

浙公网安备 33010602011771号