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