pandas--排序和排名
排序
要对行或列索引进行排序,可使用sort_index方法,它将返回一个已排序的新对象:
Series
1、对Series索引排序
1 obj=Series(range(4),index=['d','a','b','c']) 2 3 obj.sort_index() 4 Out[18]: 5 a 1 6 b 2 7 c 3 8 d 0 9 dtype: int64
2、按值对Series进行排序
1 obj=Series([4,7,-3,2]) 2 3 obj 4 Out[10]: 5 0 4 6 1 7 7 2 -3 8 3 2 9 dtype: int64 10 11 obj.sort_values() 12 Out[11]: 13 2 -3 14 3 2 15 0 4 16 1 7 17 dtype: int64
在排序时,任何缺失值默认都会被放到Series的末尾:
1 obj=Series([4,np.nan,7,np.nan,-3,2]) 2 3 obj 4 Out[13]: 5 0 4.0 6 1 NaN 7 2 7.0 8 3 NaN 9 4 -3.0 10 5 2.0 11 dtype: float64 12 13 obj.sort_values() 14 Out[14]: 15 4 -3.0 16 5 2.0 17 0 4.0 18 2 7.0 19 1 NaN 20 3 NaN 21 dtype: float64
DataFrame
1、对于DataFrame,可以根据任意一个轴上的索引进行排序:
1 frame=DataFrame(np.arange(8).reshape((2,4)),index=['three','one'], 2 columns=['d','a','b','c']) 3 4 frame 5 Out[20]: 6 d a b c 7 three 0 1 2 3 8 one 4 5 6 7 9 10 frame.sort_index() 11 Out[21]: 12 d a b c 13 one 4 5 6 7 14 three 0 1 2 3 15 16 #指定轴 17 frame.sort_index(axis=1) 18 Out[22]: 19 a b c d 20 three 1 2 3 0 21 one 5 6 7 4
数据默认是升序排序,但也可以降序排序
1 frame.sort_index(axis=1,ascending=False) 2 Out[23]: 3 d c b a 4 three 0 3 2 1 5 one 4 7 6 5
2、在DataFrame上,根据一个或多个列中的值来进行排序
1 frame=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]}) 2 3 frame 4 Out[16]: 5 a b 6 0 0 4 7 1 1 7 8 2 0 -3 9 3 1 2 10 11 frame.sort_values(by='b') 12 13 Out[17]: 14 a b 15 2 0 -3 16 3 1 2 17 0 0 4 18 1 1 7 19 20 #根据多个列进行排序,传入名称的列表即可 21 frame.sort_values(by=['a','b']) 22 23 Out[18]: 24 a b 25 2 0 -3 26 0 0 4 27 3 1 2 28 1 1 7
排名
通过Series和DataFrame的rank方法。
默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的。
Series
1 obj=Series([7,-5,7,4,2,0,4]) 2 3 obj.rank() 4 Out[20]: 5 0 6.5 6 1 1.0 7 2 6.5 8 3 4.5 9 4 3.0 10 5 2.0 11 6 4.5 12 dtype: float64 13 14 #将数值进行排序,对于相同数据排名,取排名的平均值
根据值在原数据中出现的顺序给出排名:
obj.rank(method='first') Out[21]: 0 6.0 1 1.0 2 7.0 3 4.0 4 3.0 5 2.0 6 5.0 dtype: float64
可以进行降序排名:
1 #max使用整个分组的最大排名 2 obj.rank(ascending=False,method='max') 3 Out[22]: 4 0 2.0 5 1 7.0 6 2 2.0 7 3 4.0 8 4 5.0 9 5 6.0 10 6 4.0 11 dtype: float64
DataFrame
在行或列上计算排名
1 frame=DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1], 2 'c':[-2,5,-8,-2.5]}) 3 4 frame 5 Out[25]: 6 a b c 7 0 0 4.3 -2.0 8 1 1 7.0 5.0 9 2 0 -3.0 -8.0 10 3 1 2.0 -2.5 11 12 #指定轴 13 frame.rank(axis=1) 14 Out[26]: 15 a b c 16 0 2.0 3.0 1.0 17 1 1.0 3.0 2.0 18 2 3.0 2.0 1.0 19 3 2.0 3.0 1.0
排名时用于破坏平级关系的method选项
'average' | 默认:在相等分组中,为各值分配平均排名 |
'min' | 使用整个分组的最小排名 |
'max' | 使用整个分组的最大排名 |
'first' | 按值在原数据中的出现顺序分配排名 |