如何用np.argsort实现pd.sort_values(ascending=False)功能?
解决numpy argsort与pandas sort_values降序索引不一致的问题
问题分析
你遇到的差异核心原因是:当数组中存在相等值时,pandas的sort_values(ascending=False, kind="quicksort")会对相等值对应的索引按降序排列,而numpy的argsort仅基于数组值排序,相等值的索引顺序与pandas逻辑相反。
比如数组中值为16的元素索引是24和31,pandas会把索引更大的31排在前面,而单纯的array.argsort()[::-1]会保留原数组中相等值的出现顺序(24在前,31在后),导致结果不符。
解决方案
使用numpy的lexsort实现多键排序:先按数组值降序排序,当值相等时,按索引降序排序,完全对齐pandas的逻辑。
代码实现
import numpy as np array = np.array([1., 2., 0., 0., 9., 3., 7., 13., 4., 5., 15., 5., 12., 6., 3., 1., 1., 5., 1., 9., 15., 2., 4., 7., 16., 7., 8., 11., 15., 13., 4., 16., 11.]) # 生成索引数组 indices = np.arange(len(array)) # 按(-数组值, -索引)升序排序 → 等价于按数组值降序、索引降序排序 sorted_indices = np.lexsort((-indices, -array)) # 转换为列表对比结果 print(list(sorted_indices)) # 输出: [31, 24, 20, 28, 10, 7, 29, 12, 32, 27, 4, 19, 26, 6, 23, 25, 13, 11, 9, 17, 8, 22, 30, 14, 5, 1, 21, 0, 18, 15, 16, 3, 2]
原理说明
np.lexsort会根据传入的键元组从右到左进行排序:
- 最右侧的
-array:按数组值的相反数升序排序,等价于原数组值的降序排序。 - 左侧的
-indices:当数组值相等时,按索引的相反数升序排序,等价于原索引的降序排序,完全匹配pandas的处理逻辑。
内容的提问来源于stack exchange,提问作者Daniel Habenicht
相关产品推荐
相关产品推荐

