有的时候我们可以要根据索引的大小或者值的大小对Series和DataFrame进行排名和排序。
根据条件对Series对象或DataFrame对象的值排序(sorting
)和排名(ranking
)是一种重要的内置运算。
接下来为大家介绍如何使用pandas对象的:sort_index()
/ sort_values()
/ rank()
方法。
一、排序
pandas提供了sort_index方法可以根据行或列的索引按照字典的顺序进行排序,返回一个已排 的新对象
a、Series排序
1、按索引进行排序
#定义一个Series
s = Series([1,2,3],index=["a","c","b"])
#对Series的索引进行排序,默认是升序
print(s.sort_index())
'''
a 1
b 3
c 2
'''
#对索引进行降序排序
print(s.sort_index(ascending=False))
'''
c 2
b 3
a 1
'''
2、按值进行排序
s = Series([np.nan,1,7,2,0],index=["a","c","e","b","d"])
#对Series的值进行排序,默认是按值的升序进行排序的
print(s.sort_values())
'''
d 0.0
c 1.0
b 2.0
e 7.0
a NaN
'''
#对Seires的值进行降序排序
print(s.sort_values(ascending=False))
'''
e 7.0
b 2.0
c 1.0
d 0.0
a NaN
'''
NaN值会放在Series末尾
se4=pd.Series([3,np.nan,-7,np.nan,5])
se4.sort_values()
2 -7.0
0 3.0
4 5.0
1 NaN
3 NaN
dtype: float64
对DataFrame排序
通过axis
参数可以对任意轴排序
df1=pd.DataFrame(np.arange(9).reshape(3,3),index=list("bac"),columns=list("yzx"))
print(df1)
'''
y z x
b 0 1 2
a 3 4 5
c 6 7 8
'''
print(df1.sort_index())
'''
y z x
a 3 4 5
b 0 1 2
c 6 7 8
'''
print(df1.sort_index(axis=1))
'''
x y z
b 2 0 1
a 5 3 4
c 8 6 7
'''
根据一个列的值来排序
df2=pd.DataFrame({'a':[20,3,3],'b':[1,-6,18]})
print(df2.sort_values(by='b'))
'''
a b
1 3 -6
0 20 1
2 3 18
'''
对多个列来排序
print(df2.sort_values(by=['a','b']))
'''
a b
1 3 -6
2 3 18
0 20 1
'''
降序排列
df = DataFrame(np.arange(20).reshape(5,4),index=[3,1,2,4,6],columns=['d','c','a','b'])
print(df.sort_index(ascending=False)) # 降序排列
'''
d c a b
6 16 17 18 19
4 12 13 14 15
3 0 1 2 3
2 8 9 10 11
1 4 5 6 7
'''
rank( )函数进行排名
rank函数返回从小到大排序的下标
1、默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的
In [120]:obj = pd.Series([7,-5,7,4,2,0,4])
In [121]:obj.rank()
Out [121]:
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
2、根据值在原数据中出现的顺序排名
In [122]:obj.rank(method='first')
Out [122]:
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
3、按降序进行排名
In [123]:obj.rank(ascending=False, method='max')
Out [123]:
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
4、若对DataFrame进行排序,则可根据axis指定要进行排序的轴
In [136]: frame=pd.DataFrame({'b':[5,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-3]})
In [137]: frame
Out[137]:
a b c
0 0 5 -2
1 1 7 5
2 0 -3 8
3 1 2 -3
In [138]: frame.rank(axis=0)
Out[138]:
a b c
0 1.5 3.0 2.0
1 3.5 4.0 3.0
2 1.5 1.0 4.0
3 3.5 2.0 1.0
In [139]: frame.rank(axis=1)
Out[139]:
a b c
0 2.0 3.0 1.0
1 1.0 3.0 2.0
2 2.0 1.0 3.0
3 2.0 3.0 1.0