熊猫:基于分位数的自定义排名函数

时间:2019-12-21 19:06:02

标签: python-3.x pandas quantile

我有以下数据框。

   item_id   price  quantile
0        1     10      0.1
1        3     20      0.2
2        4     30      0.3
3        6     40      0.4
4       11     50      0.5
5       12     60      0.6
6       15     70      0.7
7       20     80      0.8
8       25     90      0.9
9       26    100      1.0

我想要一个自定义的排名函数,该函数从分位数最接近0.44的记录开始,然后下降,然后上升,然后下降,然后上升...

结果应如下所示:

   item_id   price  quantile   customed_rank
0        1     10      0.1         6
1        3     20      0.2         4
2        4     30      0.3         2
3        6     40      0.4         1
4       11     50      0.5         3
5       12     60      0.6         5
6       15     70      0.7         7
7       20     80      0.8         8
8       25     90      0.9         9 
9       26    100      1.0        10

其他方法然后遍历整个数据框以实现此目的,是否有更优雅的方法来实现此目的?谢谢!

1 个答案:

答案 0 :(得分:4)

您要按quantile与0.44之差的绝对值进行排名。

(df['quantile'] - 0.44).abs().rank()
0     7.0
1     5.0
2     3.0
3     1.0
4     2.0
5     4.0
6     6.0
7     8.0
8     9.0
9    10.0
Name: quantile, dtype: float64

一种更快(但更丑陋)的选择是两次argsort

(df['quantile'] - 0.44).abs().values.argsort().argsort() + 1
array([ 7,  5,  3,  1,  2,  4,  6,  8,  9, 10])

请注意,仅当您使用Numpy数组对象(通过values属性)而不是Pandas系列对象时,此解决方案才会更快。