我有一个包含列表的字典,每个列表都有相同数量的元素。
to_sort={'a':np.array([1,1,3]),'b':np.array([5,4,5])}
我想添加一个新密钥'rank',它根据'a'包含排序字典的索引,如果是tie,则根据'b'。 我能做到:
to_sort['a'].argsort()
并获取排序索引。但是,如果示例中出现平局,我会得到:
np.array([1,3,3]).argsort()
Out[17]: array([0, 1, 2], dtype=int64)
现在我想使用'b'的值对这些排序索引进行排名。
例如期望的输出 - > [1,0,2]
而非[0,1,2]
。
Python原生解决方案首选
答案 0 :(得分:1)
res = np.lexsort((to_sort['b'], to_sort['a']))
# array([1, 0, 2], dtype=int64)
请注意此功能的反向排序顺序,即上面的代码先按a
排序,然后按b
排序。
答案 1 :(得分:0)
我发现使用pandas相对容易
custom_ranked=pd.DataFrame(to_sort).sort_values(['a','b'],
ascending=[False,True]).loc[:,['a','b']]