Pandas 根据行号重新排列DataFrame的列
问题描述
有一个DataFrame:
import pandas as pd
df = pd.DataFrame(data = {'a':[3,0,2,1],'b':[4,3,2,1],'c':[3,2,1,0],'d':[4,3,2,0]})
print(df)
>>> df
a b c d
0 3 4 3 4
1 0 3 2 3
2 2 2 1 2
3 1 1 0 0
如何根据每一列单元格中的数字分布重新排列(排序)整个df?例如,一列的内容是[3,2,1],那么它应该在其他元素是[3,2,0]的列之前排列。当比较两列时,按序比较每一行的数字。如果第一行相同,则比较下一行。
期望的结果如下:
>>> dd
b d c a
0 4 4 3 3
1 3 3 2 0
2 2 2 1 2
3 1 0 0 1
解决方案
对于一个高效的解决方案,不要重复发明轮子,直接使用sort_values
:
out = df.sort_values(by=list(df.index), axis=1, ascending=False)
或者最终numpy.lexsort
:
out = df.iloc[:, np.lexsort(-df[::-1].to_numpy())]
输出:
b d c a
0 4 4 3 3
1 3 3 2 0
2 2 2 1 2
3 1 0 0 1