排序分两种:根据索引排序和根据元素值排序
根据索引排序使用的是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的排名规则不太好理解,其规则如下:
比如下面的例子:
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
也可以根据观察顺序进行排名位次分配,主要是重复的数,按顺序先后给排名,揣摩一下就能明白规律:
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参数可以使用的排名方法:
s.rank(method='max',ascending=False) 我理解是先排序为7, 7, 4 , 4,2,0,-5 第一个 7为1.0 第二个 7为2.0 (1.0+2.0)/2=1.5 四舍五入 2.0 第一个 4为3.0 第二个 4为4.0 (3.0+4.0)/2=3.5 -> 4.0 ……以此类推 不知道是不是这样?