数据框调整
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
我有一个具有类似行和列标签的数据框,就像任何其他方阵一样,如下所示:
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