鉴于此输入
df = pd.DataFrame(
[["1 (2)", "4"], ["5 (3)", "2"], ["4 (2)", "4"], ["1 (1)", "4"], ["1 (2)", "3"]],
columns=["a", "b"],
)
a b
0 1 (2) 4
1 5 (3) 2
2 4 (2) 4
3 1 (1) 4
4 1 (2) 3
到达这个输出
expected = pd.DataFrame(
[["1 (2)", "4", 2], ["5 (3)", "2", 0], ["4 (2)", "4", 1], ["1 (1)", "4", 4], ["1 (2)", "3", 3]],
columns=["a", "b", "c"],
)
a b c
0 1 (2) 4 2
1 5 (3) 2 0
2 4 (2) 4 1
3 1 (1) 4 4
4 1 (2) 3 3
其中 c 列包含 a 列中已排序的项目的顺序。我需要这样做:
indexes_human_sorted = natsort.index_humansorted(df["a"], reverse=True) # [1, 2, 0, 4, 3] gets the values in order x[1], x[2], x[0] etc.
for i, x in enumerate(indexes_human_sorted):
df.loc[x, "c"] = i
a b c
0 1 (2) 4 2.0
1 5 (3) 2 0.0
2 4 (2) 4 1.0
3 1 (1) 4 4.0
4 1 (2) 3 3.0
我相信索引上的循环(很慢)应该是不必要的,我认为我错过了 natsort 的一些技巧。