12.排序和排名
排序和排名
排序分两种:根据索引排序和根据元素值排序
索引排:
根据索引排序使用的是sort_index方法,它返回一个新的排好序的对象:
In [103]: s = pd.Series(range(4),index = list('dabc'))
In [104]: s
Out[104]:
d 0
a 1
b 2
c 3
dtype: int64
In [105]: s.sort_index() # 根据索引的字母序列排序
Out[105]:
a 1
b 2
c 3
d 0
dtype: int64
In [108]: df = pd.DataFrame(np.random.randint(10,size=(4,3)), columns=list('edb'),index = ['two','one','five','four'])
In [109]: df
Out[109]:
e d b
two 7 6 1
one 5 6 8
five 8 4 1
four 7 0 3
In [110]: df.sort_index() # 默认按行索引排序,并以字母顺序
Out[110]:
e d b
five 8 4 1
four 7 0 3
one 5 6 8
two 7 6 1
In [111]: df.sort_index(axis=1) # 指定按列排序
Out[111]:
b d e
two 1 6 7
one 8 6 5
five 1 4 8
four 3 0 7
In [112]: df.sort_index(axis=1,ascending=False) # 默认升序,可以指定为倒序
Out[112]:
e d b
two 7 6 1
one 5 6 8
five 8 4 1
four 7 0 3
如果要根据某行或某列元素的值的大小进行排序,就要使用sort_values方法:
In [113]: s= pd.Series([4, 7,-3,2])
In [114]: s.sort_values()
Out[114]:
2 -3
3 2
0 4
1 7
dtype: int64
# np.nan缺失值会自动排到最后
In [115]: s2 = pd.Series([4, np.nan,7,np.nan,-3,2])
In [116]: s2
Out[116]:
0 4.0
1 NaN
2 7.0
3 NaN
4 -3.0
5 2.0
dtype: float64
In [117]: s2.sort_values()
Out[117]:
4 -3.0
5 2.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64
In [118]: df2 = pd.DataFrame({'b':[4,7,-3,2], 'a':[0,1,0,1]})
In [120]: df2
Out[120]:
b a
0 4 0
1 7 1
2 -3 0
3 2 1
In [121]: df2.sort_values(by='b') # 根据某一列里的元素值进行排序
Out[121]:
b a
2 -3 0
3 2 1
0 4 0
1 7 1
In [122]: df2.sort_values(by=['a','b']) # 根据某些列进行排序
Out[122]:
b a
2 -3 0
0 4 0
3 2 1
1 7 1
除了排序,还有排名。Pandas的排名规则不太好理解,其规则如下:
- 以升序排名为例
- 所有数中最小的数排为1.0
- 按数大小依此类推,2.0、3.0、4.0给安排位次
- 如果有重复的数,则重复的排名相加除以重复的个数,得出一个排名
- 重复的数后面的排名,接着排
比如下面的例子:
In [123]: s = pd.Series([7,-5,7,4,2,0,4])
In [124]: s.rank()
Out[124]:
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
- -5最小,给排名1.0
- 0其次,排2.0
- 2再次,排3.0
- 有2个4,于是4.0+5.0等于9,再除个数2,最终排名4.5。4.0和5.0两个排名并未使用。
- 又有2个7,于是6.0+7.0等于13,再除2,最后排名6.5
也可以根据观察顺序进行排名位次分配,主要是重复的数,按顺序先后给排名,揣摩一下就能明白规律:
In [125]: s.rank(method='first')
Out[125]:
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
还可以按最大值排名,并降序排列:
In [126]: s.rank(method='max',ascending=False)
Out[126]:
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
DataFrame则可以根据行或列计算排名:
In [128]: df = pd.DataFrame(np.random.randint(-10,10,(4,3)),columns=list('abc'))
In [129]: df
Out[129]:
a b c
0 -9 -1 -8
1 -10 8 -7
2 -4 2 6
3 9 -2 -7
In [130]: df.rank(axis='columns')
Out[130]:
a b c
0 1.0 3.0 2.0
1 1.0 3.0 2.0
2 1.0 2.0 3.0
3 3.0 2.0 1.0
下面列出了method参数可以使用的排名方法:
- average:默认方式,计算平均排名
- min:最小排名
- max:最大排名
- first:观察顺序排名
- dense:类似min,但组间排名总是增加1
转自:https://www.liujiangblog.com/course/data/