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

问题描述 投票:0回答:1

我有以下数据框。

   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

[然后循环遍历整个数据帧来执行此操作,是否有更优雅的方法来实现此目的?谢谢!

python-3.x pandas quantile
1个回答
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系列对象时,此解决方案才会更快。

© www.soinside.com 2019 - 2024. All rights reserved.