У меня есть фрейм данных с аналогичными метками строк и столбцов, как и любая другая квадратная матрица, как показано ниже:
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
Ваш латекс не отображается прямо на SO ... не могли бы вы преобразовать в фактический текстовый вывод, который вы ожидаете?
Просто предоставил ожидаемый результат. «0» по диагонали вверх и «1» по диагонали вниз.
@Roosha спасибо за обновление, решение смотрите ниже;)
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
Я мог и не додуматься в первую очередь сделать заказ. Благодарю вас! это очень интересно.
можете ли вы предоставить ожидаемый результат?