1

鉴于此输入

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 的一些技巧。

4

1 回答 1

2

你可以使用np.argsort我相信:

df['c'] = np.argsort(natsort.index_humansorted(df['a'],reverse=True))

print(df)

       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
于 2021-06-09T16:37:37.457 回答