我有以下数据框。
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系列对象时,此解决方案才会更快。