У меня есть матрица совместного вхождения в пандах. Как получить значения ко-вхождения всех комбинаций, отсортированные по убыванию без зацикливания? (Я не писал значения на другой стороне диагонали, но они есть и содержат зеркальные значения)

Вход:

  A  B  C  D  E  F
A 0  1  0  1  2  0
B    0  3  1  1  1
C       0  1  8  9
D          0  2  6
E             0  9
F                0

Выход:

CF  9
EF  9
CE  8
DF  6
BC  3
AE  2
DE  2
AB  1
AD  1
BD  1
BE  1
BF  1
CD  1
AC  0
AF  0
0
AnonX 13 Мар 2018 в 23:09

2 ответа

Лучший ответ
i, j = np.triu_indices(len(df), 1)

pd.Series(
    df.values[i, j], df.index[i] + df.index[j]
).sort_values(ascending=False)

EF    9
CF    9
CE    8
DF    6
BC    3
DE    2
AE    2
CD    1
BF    1
BE    1
BD    1
AD    1
AB    1
AF    0
AC    0
dtype: object

Настройка

txt = """\
  A  B  C  D  E  F
A 0  1  0  1  2  0
B    0  3  1  1  1
C       0  1  8  9
D          0  2  6
E             0  9
F                0"""

df = pd.read_fwf(pd.io.common.StringIO(txt), index_col=0).fillna('')
df

   A  B  C  D  E  F
A  0  1  0  1  2  0
B     0  3  1  1  1
C        0  1  8  9
D           0  2  6
E              0  9
F                 0
4
piRSquared 13 Мар 2018 в 20:55

Вы можете просматривать строки и столбцы с помощью combinations из itertools и добавлять в список.

from itertools import combinations
explode_list = []
_ = [explode_list.append([r + c, df.loc[r][c]]) for r, c in combinations(df.columns, 2)]

Вывод

[['AB', 1],
 ['AC', 0],
 ...
]
0
titipata 13 Мар 2018 в 20:32