排序和排名

阅读: 5126     评论:1

排序分两种:根据索引排序和根据元素值排序

根据索引排序使用的是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. 以升序排名为例
  2. 所有数中最小的数排为1.0
  3. 按数大小依此类推,2.0、3.0、4.0给安排位次
  4. 如果有重复的数,则重复的排名相加除以重复的个数,得出一个排名
  5. 重复的数后面的排名,接着排

比如下面的例子:

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

 函数和映射 统计和汇总 

评论总数: 1


点击登录后方可评论

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 ……以此类推 不知道是不是这样?