如何在 Pandas Dataframe 中按行升序排序

How to sort ascending row-wise in Pandas Dataframe

这听起来可能很傻,但我就是想不通。 我有一个这样的 Pandas 数据框:

    N1  N2  N3  N4  N5
0   48  20  45  21  12
1   32  16  29  41  36
2   41  42  34  13  9
3   39  37  4   7   33
4   32  3   1   39  21
... ... ... ... ... ...
1313    1   5   27  36  42
1314    18  20  35  38  48
1315    12  34  37  38  42
1316    18  23  37  41  42
1317    2   10  18  34  35

并且我想对每一行进行排序,以便该行从最小到最大重新排列。我不想更改列标签。即它看起来像这样:

    N1  N2  N3  N4  N5
0   48  45  21  20  12
1   41  32  36  29  16
2   42  41  34  13  9

我试过使用 iloc 的 for 循环,运行 通过索引,一次一行,应用 sort_values,但它不起作用。有帮助吗?

您可以按 numpy.sort 对行进行排序,按 [:, ::-1] 交换降序,如果性能很重要,则传递给 DataFrame 构造函数:

df = pd.DataFrame(np.sort(df, axis=1)[:, ::-1], 
                  columns=df.columns, 
                  index=df.index)
print (df)
      N1  N2  N3  N4  N5
0     48  45  21  20  12
1     41  36  32  29  16
2     42  41  34  13   9
3     39  37  33   7   4
4     39  32  21   3   1
1313  42  36  27   5   1
1314  48  38  35  20  18
1315  42  38  37  34  12
1316  42  41  37  23  18
1317  35  34  18  10   2

如果分配回来,性能会差一点:

df[:] = np.sort(df, axis=1)[:, ::-1]

性能:

#10k rows
df = pd.concat([df] * 1000, ignore_index=True)

#Ynjxsjmh sol
In [200]: %timeit df.apply(lambda row: list(reversed(sorted(row))), axis=1, result_type='expand')
595 ms ± 19.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

#Andrej Kesely sol1
In [201]: %timeit df[:] = np.fliplr(np.sort(df, axis=1))
559 µs ± 38.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#Andrej Kesely sol2
In [202]: %timeit df.loc[:, ::-1] = np.sort(df, axis=1)
518 µs ± 11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#jezrael sol2
In [203]: %timeit df[:] = np.sort(df, axis=1)[:, ::-1]
491 µs ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#jezrael sol1
In [204]: %timeit pd.DataFrame(np.sort(df, axis=1)[:, ::-1], columns=df.columns, index=df.index)
399 µs ± 2.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

您可以在 result_type expandbroadcast

的行上尝试 apply
df = df.apply(lambda row: list(reversed(sorted(row))), axis=1, result_type='expand')
print(df)

    0   1   2   3   4
0  48  45  21  20  12
1  41  36  32  29  16
2  42  41  34  13   9
3  39  37  33   7   4
4  39  32  21   3   1

尝试 np.sort:

df[:] = np.fliplr(np.sort(df, axis=1))
print(df)

打印:

   N1  N2  N3  N4  N5
0  48  45  21  20  12
1  41  36  32  29  16
2  42  41  34  13   9
3  39  37  33   7   4
4  39  32  21   3   1

或者:

df.loc[:, ::-1] = np.sort(df, axis=1)