还是因为在项目中需要对数据集进行排名,所以就去查找资料和翻书里关于pandas是如何对数据进行排名的方法,然后就学到了rank()。因为发现书里讲的很简洁,尤其是例子的解释很少,所以打算写下自己对书中案例的理解,希望能帮到有需要的人。如果有理解错误的地方,欢迎指出来我们一起探讨一下!?
- 首先我们来看书中第一个例子:
obj = pd.Series([7,-5,7,4,2,0,4])
obj.rank()
然后输出结果为:
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
问题一: 为何这里的排名会是“6.5、1.0…”这样的写法?
解答:
- 首先我们先看原始数据,我们把它竖起来看:
7
-5
7
4
2
0
4
- 接着我们对它按从小到大排名次:
rank
0 -5
1 0
2 2
3 4
4 4
5 7
6 7
- 现在我们来解释为啥最后排名会写成上面的6.5那样:根据rank方法的定义,-5 是最小的,所以它就排在第一位,即1.0 ;
同理0 这个数就是第二名,写成 2.0 ;
同样就可以理解2的写法了;
我们来到4 这两个数,因为他们重复了,所以我们取它们的排名4.0 和 5.0 的平均值,即写成 4.5;
这下也不难理解最后同样两个7的写法6.5了。
最后我们就再把换算后的排名重新按照一开始的顺序写上去就是我们看到的那个结果!!!
(PS:之所以后面重复的数会用到平均排名,这是因为对于rank()方法, pandas规定的是 默认使用平均排名属性,即“ average”)
- 第二个例子讲的是排名也可以根据他们在数据中的观察顺序进行分配:
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
问题二:为什么第六名和第七名对应的结果变成了 6.0 和 7.0?而不是之前的平均排名 6.5 ?
解答:
因为我们在rank后面设置了这个方法:
method= 'first'
它的的含义就是: 我们先看到那个数字,哪个数字的排名就优先!
所以这两个7 我们先看到最开头的,它按顺序是排在 第六名的,所以写作 6.0;同理第二个看到的就是第七名,写作 7.0。这样也可以理解两个 4 的排名写法了!
- 第三个例子,是关于降序排名的:
obj.rank(ascending = False, method = 'max')
输出结果是:
#将值分配给组中的最大排名
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
到这里,大家应该都很好理解这个输出结果是怎么来的了,跟上面的类似,因为我们使用了
method = 'max'
这个方法,所以当两个同样的 7 出现的时候,一个排名写作 1.0 , 另一个排名写作 2.0 ,我们就取最大的那个值来表示。
书上也总结了打破平级关系排名的方法:
方法 | 描述 |
---|---|
‘average’ | 默认:在每个组中分配平均排名 |
‘min’ | 对整个组使用最小值排名 |
‘max’ | 对整个组使用最大值排名 |
‘first’ | 按照值在数据中出现的次序分配排名 |
‘dense’ | 类似于method = ‘min’ ,但组间排名总是增加1,而不是一个组中的相等元素的数量 |
- 最后是使用DataFrame对行或者列计算排名的这个例子:
frame = pd.DataFrame({
'b' : [4.3, 7, -3, 2],
'a' : [0, 1, 0, 1],
'c': [-2, 5, 8, -2.5]
})
frame
b a c
0 4.3 0 -2.0
1 7.0 1 5.0
2 3.0 0 8.0
3 2.0 1 -2.5
frame.rank(axis = 'columns')
最后输出的结果是:
b a c
0 3.0 2.0 1.0
1 3.0 1.0 2.0
2 1.0 2.0 3.0
3 3.0 2.0 1.0
问题三:为什么这里的排名会是 3.0、 2.0、 1.0 这样的?
解答:
因为我们在rank后面设置了
axis = 'columns'
即以列作为轴来看,当我们要排名的时候,就是要对 b, a , c 这三列排名,所以排名要横向比较大小!理解这里后就明白了第一行为啥这样写,因为 4.3 就是第三名,所以写成 3.0;同理 0 就是第二名,写成 2.0;而 -2.0 就是 1.0。
(注意:所有的排名和排序,默认都是按升序来的!)
好了,这篇文章就详解pandas的rank()方法到这里,谢谢阅读,希望对你有帮助!
文中示例代码来源:
《利用Python进行数据分析》