如果我们想要对行标或者列标进行字典排序(lexicographically),那么就可以使用 sort_index()
方法。
对于 Series,当然就是根据行标 index
进行排序了:
import numpy as np
import pandas as pd
s = pd.Series(range(4), index=['d', 'b', 'a', 'c'])
s
"""
d 0
b 1
a 2
c 3
dtype: int64
"""
s.sort_index()
"""
a 2
b 1
c 3
d 0
dtype: int64
"""
对于 DataFrame,我们可以对行标和列标都进行排序。默认情况下,会根据行标排序,如果将 axis
参数设置为 1,那么就会根据列标排序:
df = pd.DataFrame(np.arange(8).reshape(2, 4),
index=['nine', 'four'],
columns=['d', 'b', 'a', 'c'])
print(df)
"""
d b a c
nine 0 1 2 3
four 4 5 6 7
"""
df.sort_index()
"""
d b a c
four 4 5 6 7
nine 0 1 2 3
"""
df.sort_index(axis=1)
"""
a b c d
nine 2 1 3 0
four 6 5 7 4
"""
默认情况下,数据是按升序排列的,如果想要降序排列,可以将 ascending
设置为 False
:
df.sort_index(axis=1, ascending=False)
"""
d c b a
nine 0 3 1 2
four 4 7 5 6
"""
如果想要根据值进行排序,那么就要使用 sort_values()
,值对应的 index
不会改变。
对于 Series 来说没什么可说的,但要注意如果有缺失值,则缺失值会被排到最后:
s1 = pd.Series([-2, 2, 12, 0])
s1.sort_values()
"""
0 -2
3 0
1 2
2 12
dtype: int64
"""
s2 = pd.Series([-2, np.nan, 8, 0, 3, np.nan, 6])
s2.sort_values()
"""
0 -2.0
3 0.0
4 3.0
6 6.0
2 8.0
1 NaN
5 NaN
dtype: float64
"""
对于 DataFrame,我们可以根据一列或者多列来进行排序,需要将相应的列名传入 by
参数中:
df = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
print(df)
"""
b a
0 4 0
1 7 1
2 -3 0
3 2 1
"""
df.sort_values(by='b')
"""
b a
2 -3 0
3 2 1
0 4 0
1 7 1
"""
根据多列:
df.sort_values(by=['a', 'b'])
"""
b a
2 -3 0
0 4 0
3 2 1
1 7 1
"""
这相当于先根据 column b 排序,再根据 column a 进行排序,所以等价于下面的语句:
df.sort_values(by='b').sort_values(by='a')
Python for Data Analysis, 2 n d ^{\rm nd} nd edition. Wes McKinney.