数据框调整

Dataframe Adjustment

我有一个具有类似行和列标签的数据框,就像任何其他方阵一样,如下所示:

    a  b  c  d  e  f

a   1  1  0  1  0  1
b   0  0  0  0  0  1
c   0  1  1  0  1  0
d   1  0  0  1  1  0
e   0  1  1  0  0  0
f   0  0  0  1  0  1

如何将此数据帧转换为另一种形式(通过重新排列行和列),其中所有非零对角线元素都在下块中,零对角线元素在上块中?换句话说,矩阵已经被排列,使得“1”个对角线元素在较低的块中,“0”个对角线元素在较高的块中,如下所示:

    b  e  a  c  d  f

b   0  0  0  0  0  1
e   1  0  0  1  0  0
a   1  0  1  0  1  1
c   1  1  0  1  0  0
d   0  1  1  0  1  0
f   0  0  0  0  1  1

IIUC,你可以提取底层numpy数组的对角线并用numpy.argsort得到排序顺序,然后用iloc切片:

import numpy as np
order = np.argsort(df.to_numpy().diagonal())

df2 = df.iloc[order, order]

输出:

   b  e  a  c  d  f
b  0  0  0  0  0  1
e  1  0  0  1  0  0
a  1  0  1  0  1  1
c  1  1  0  1  0  0
d  0  1  1  0  1  0
f  0  0  0  0  1  1