Pandas: 基于分位数的自定义排序函数

Pandas: customed rank function based on 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

或者循环遍历整个数据帧来做到这一点,有没有更优雅的方法来实现这个?谢谢!

您想按 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 系列对象时,此解决方案才会更快。