根据与指定值的接近程度对 Pandas DataFrame 进行排名

Ranking Pandas DataFrame Based on Closeness to a Specified Value

如果这是一项微不足道的任务,我们深表歉意。我对编码和 Python 非常陌生,并且正在学习作为我论文的一部分。

我有一个数据框,我想根据它与指定值的接近程度而不是升序或降序对其中的每一列进行排名。

我正在研究比较 Running/Cycling 路线的方法。作为此过程的一部分,我试图找出查询路线与基于几个不同属性的目标路线的比较情况:距离、高程增益、高程损失和梯度。我的结果数据框显示了比较中每个属性中两条路由之间的错误(即 [目标路由值 - 查询路由值] / 目标路由值)。我目前面临的问题是对这些结果进行排名。由于完美匹配的值为 0,因此我想根据与此的接近程度对这些值进行排名。

待排序的数据框:

scores = pd.DataFrame({'distance':[0.15, 0.07, -0.09, 0], 'elevation_gain': 
        [-0.19,-8.39, -0.86, 0],'elevation_loss':[-3.73, -2.51, -0.16, 0], 
        'gradient': [0.12, 0.39, 2.77, 0]})

在本例中,第4条路由是查询路由,结果是完美匹配,因此应该排在第1位。
由于存在负值,我认为降序排列不合适。

我的目标是:

ranks = pd.DataFrame({'distance':[4, 2, 3, 1], 'elevation_gain': [2,4, 3, 
      1],'elevation_loss':[4, 3, 2, 1], 'gradient': [2, 3, 4, 1]})

(Appologies 我不知道如何可视化这些数据框以使其更容易理解)

然后我可以创建一个新列,对排名求和,最低分数表示最佳匹配。

提前感谢您的帮助!

试试这个:

ranks = scores.abs().apply(pd.Series.rank).astype(int)
ranks 

输出:

   distance  elevation_gain  elevation_loss  gradient
0         4               2               4         2
1         2               4               3         3
2         3               3               2         4
3         1               1               1         1