這聽起來可能很愚蠢,但我似乎無法弄清楚。我有一個像這樣的 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,但它不起作用。有什么幫助嗎?
uj5u.com熱心網友回復:
如果性能很重要,您可以按 對行進行排序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)
uj5u.com熱心網友回復:
您可以嘗試apply使用result_type expand或broadcast
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
uj5u.com熱心網友回復:
嘗試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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466658.html
上一篇:并排合并Pandas資料框列
