如何在 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
expand
或 broadcast
的行上尝试 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)
这听起来可能很傻,但我就是想不通。 我有一个这样的 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
expand
或 broadcast
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)