python-3.x - 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 和 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 系列对象时,此解决方案才会更快。
推荐阅读
- powerbi - 如何在 Power BI 中的两行计算中添加新列?
- python - 如果字符串中没有空格,如何在字符串中添加空格?
- node.js - 猫鼬不在nodejs中获取数据
- docker - 检查访问了多少 docker 映像?
- python - Numpy polyfit 预测 - 如何在“训练”数据中包含错误?
- javascript - 调用 location.reload() 后如何运行附加的 JS 函数?
- angular - 在 Windows nginx 服务器上运行 Angular Springboot 应用程序 - nginx.conf 设置
- javascript - 给定不同的唯一键:值,是否可以使用“=”设置一个对象属性?
- pandas - 如何在pandas groupby之后将行旋转到列
- oracle - 当 Oracle Function 没有输入值时,Spring Boot SimpleJdbcCall 失败