Pandas中的排名方法
排名是指对于数组从1到有效据点总数分配名次的操作。Series和DataFrame的rank方法是实现排名的方法,以下为rank方法的详解。
方法概述
首先用Series模拟一份数据如下:
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
对其使用rank()方法进行排名
obj.rank()
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
可以观察到rank是用如下方法排序的,按排名整理一下如右表所示:
数值 排名 数值 排名
0 7 6.5 1 -5 1.0
1 -5 1.0 5 0 2.0
2 7 6.5 4 2 3.0
3 4 4.5 6 4 4.5
4 2 3.0 3 4 4.5
5 0 2.0 2 7 6.5
6 4 4.5 0 7 6.5
可以发现同一个值,其排名分配被均分,例如3号和6号的4被均分为都为4.5,0号和2号的7被均分为6.5,这是参数method='average'决定的,在默认情况下为此参数。
rank中的method参数
上一节中介绍到当不指定参数时,method默认为average,此表罗列了其余method参数。
排名中的平级关系打破方法
| 方法 | 描述 |
|---|---|
| 'average' | 默认:在每个组中分配平均排名 |
| 'min' | 对整个数组使用最小排名 |
| 'max' | 对整个数组使用最大排名 |
| 'first' | 按照值在数据中出现的次序分配排名 |
| 'dense' | 类似于method='min',但组间排名总是增加1,而不是一个组中的相等元素的数量 |
Method中first的用法
使用first进行排名:
obj.rank(method='first')
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
可以看到使用此参数时,不会存在均值,而是一个个按顺序依次排名,其中标签3的4排名为4.0,标签6的4排名为5.0是因为标签按顺序排列,标签3在标签6的前面,按照排名整理下如右表所示。
数值 排名 数值 排名
0 7 6.0 1 -5 1.0
1 -5 1.0 5 0 2.0
2 7 7.0 4 2 3.0
3 4 4.0 3 4 4.0
4 2 3.0 6 4 5.0
5 0 2.0 0 7 6.0
6 4 5.0 2 7 7.0
Method中max与min的用法
max与min可以理解为相较于average而言,max将均值中相同排名的数值按照最大的那个排名取值,而min则相反。
max的用法:
obj.rank(method='max')
0 7.0
1 1.0
2 7.0
3 5.0
4 3.0
5 2.0
6 5.0
dtype: float64
min的用法:
obj.rank(method='min')
0 6.0
1 1.0
2 6.0
3 4.0
4 3.0
5 2.0
6 4.0
dtype: float64
三者对比如下表所示,右表为整理后按排名排序:
数值 average max min 数值 average max min
0 7 6.5 7.0 6.0 1 -5 1.0 1.0 1.0
1 -5 1.0 1.0 1.0 5 0 2.0 2.0 2.0
2 7 6.5 7.0 6.0 4 2 3.0 3.0 3.0
3 4 4.5 5.0 4.0 3 4 4.5 5.0 4.0
4 2 3.0 3.0 3.0 6 4 4.5 5.0 4.0
5 0 2.0 2.0 2.0 0 7 6.5 7.0 6.0
6 4 4.5 5.0 4.0 2 7 6.5 7.0 6.0
Method中dense的用法
该参数和average类似,相同数值相同排名,但是数值为整数且不会出现跳跃。
obj.rank(method='dense')
0 5.0
1 1.0
2 5.0
3 4.0
4 3.0
5 2.0
6 4.0
dtype: float64
对比如下:
数值 average dense 数值 average dense
0 7 6.5 5.0 1 -5 1.0 1.0
1 -5 1.0 1.0 5 0 2.0 2.0
2 7 6.5 5.0 4 2 3.0 3.0
3 4 4.5 4.0 6 4 4.5 4.0
4 2 3.0 3.0 3 4 4.5 4.0
5 0 2.0 2.0 2 7 6.5 5.0
6 4 4.5 4.0 0 7 6.5 5.0
rank中的ascending参数
默认情况下是使用升序排序,将ascending设为False可以使用降序,值越大,排名越靠前:
obj.rank(ascending=False)
0 1.5
1 7.0
2 1.5
3 3.5
4 5.0
5 6.0
6 3.5
dtype: float64
对比如下:
数值 升排名 降排名 数值 升排名 降排名
0 7 6.5 1.5 1 -5 1.0 7.0
1 -5 1.0 7.0 5 0 2.0 6.0
2 7 6.5 1.5 4 2 3.0 5.0
3 4 4.5 3.5 3 4 4.5 3.5
4 2 3.0 5.0 6 4 4.5 3.5
5 0 2.0 6.0 0 7 6.5 1.5
6 4 4.5 3.5 2 7 6.5 1.5
rank中的na_option参数
该参数表示的是空值是否参与排名,可取keep,top,bottom,参数作用如下:
obj = pd.Series([7, -5, 7, 4, np.nan, 2, 0, 4])
obj
0 7.0
1 -5.0
2 7.0
3 4.0
4 NaN
5 2.0
6 0.0
7 4.0
dtype: float64
使用keep时,将保留缺失值。
obj.rank(method='dense', na_option='keep')
0 5.0
1 1.0
2 5.0
3 4.0
4 NaN
5 3.0
6 2.0
7 4.0
dtype: float64
使用top时,缺失值将排名第一。
obj.rank(method='dense', na_option='top')
0 6.0
1 2.0
2 6.0
3 5.0
4 1.0
5 4.0
6 3.0
7 5.0
dtype: float64
使用bottom时,缺失值将排名最后。
obj.rank(method='dense', na_option='bottom')
0 5.0
1 1.0
2 5.0
3 4.0
4 6.0
5 3.0
6 2.0
7 4.0
dtype: float64

浙公网安备 33010602011771号