np.argsort和index_natsorted自然排序的区别

问题描述 投票:0回答:1

我有下面的数据框,我想按“时间”列自然排序。

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

df.sort_values(
    by="time",
    key=lambda x: index_natsorted(df["time"])
    
)

我使用

natsort.index_natsorted
函数,它应该按 ['0hr','48hr','72hr','96hr','128hr'] 的顺序返回 'time' 列,因为 index_natsorted,应用于给定的“时间”列,返回一个 [0, 3, 2, 4, 1] 的元组,它假设以上述方式对该列进行排序,元组中的 0 引用该元组的第一个元素“0hr” “时间”列,元组中的后续 3 引用“时间”列的第四个元素“48hr”,依此类推...

但是我得到的输出是:

output:
time value
0hr   10
96hr  50
72hr  30
128hr 20
48hr  40

有人可以向我解释为什么

index_natsorted
函数会按此顺序返回“时间”列吗? 与
np.argsort
类似,
index_natsorted
的文档写道“自然地对序列进行排序,但返回排序索引的列表,而不是排序列表本身。”所以我很好奇为什么在这种情况下它返回的索引不会自然地对元素进行排序。

python pandas numpy sorting natsort
1个回答
0
投票

numpy.argsort
natsort.index_natsorted
都具有相同的功能,即返回根据原始数组的元素排序的索引数组。 它们的区别在于它们是针对不同的库实现的。 例如
numpy.argsort
对更高维度有一些概括。 两者都会按字母顺序对字符串进行排序。

假设您的时间列始终采用“hr”格式,我建议您使用以下解决方案来解决您的问题:

import pandas as pd

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

df.sort_values(
    by="time",
    key=lambda series: pd.Series([int(t[:-2]) for t in series])
)

哪个输出:

    time  value
0    0hr     10
3   48hr     40
2   72hr     30
4   96hr     50
1  128hr     20
© www.soinside.com 2019 - 2024. All rights reserved.