You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

np.argsort与index_natsorted差异及pandas自然排序异常问题

问题原因与解决方法

核心错误

你在sort_values的key参数中误用了index_natsorted:

  • sort_values的key函数要求返回与原列元素一一对应的排序键序列,pandas会根据这些键值对原数据排序。
  • 但你直接返回了index_natsorted(df["time"])生成的索引数组([0,3,2,4,1]),这相当于给原DataFrame的每一行分配了一个固定的索引值,而非基于该行time字段的自然排序键,导致排序逻辑完全偏离预期。

为什么index_natsorted不能这么用

index_natsorted的作用是直接返回自然排序后的行索引列表,它的用法和np.argsort一致——你应该用这些索引直接提取行,而不是传给sort_values的key参数。

正确实现方式

方式1:直接用index_natsorted索引行

import pandas as pd
from natsort import index_natsorted

df = pd.DataFrame({
   "time": ['0hr', '128hr', '72hr', '48hr', '96hr'],
   "value": [10, 20, 30, 40, 50]
})

# 用自然排序后的索引直接取行
sorted_df = df.iloc[index_natsorted(df["time"])]
print(sorted_df)

方式2:用sort_values的key参数生成自然排序键

如果一定要用sort_values,可以通过natskey函数为每个time元素生成可排序的自然键:

import pandas as pd
from natsort import natskey

df = pd.DataFrame({
   "time": ['0hr', '128hr', '72hr', '48hr', '96hr'],
   "value": [10, 20, 30, 40, 50]
})

# 为每个time字段生成自然排序键
sorted_df = df.sort_values(by="time", key=lambda x: x.apply(natskey))
print(sorted_df)

两种方式都会得到预期的排序结果:

time  value
0    0hr     10
3   48hr     40
2   72hr     30
4   96hr     50
1  128hr     20

内容的提问来源于stack exchange,提问作者helia yilibel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:25:03