我有下面的数据框,我想按“时间”列自然排序。
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
的文档写道“自然地对序列进行排序,但返回排序索引的列表,而不是排序列表本身。”所以我很好奇为什么在这种情况下它返回的索引不会自然地对元素进行排序。
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