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
相关产品推荐
相关产品推荐

