Эффективный способ создания словаря симметричной матрицы с парой столбец-строка в качестве ключа и соответствующим значением в матрице в качестве значения

Я хочу создать словарь в форме (строка, столбец): значение из симметричной матрицы (например, матрицы расстояний), как показано ниже, без учета значений NaN или нулей (нули - это диагональ). Матрица представляет собой кадр данных pandas.

Material  100051    100120    100138    100179    100253    100265    100281                                                                         
100051       0.0  0.953488  0.959302  0.953488  0.959302  0.953488  0.953488   
100120       NaN  0.000000  0.965116  0.953488  0.959302  0.959302  0.959302   
100138       NaN       NaN  0.000000  0.959302  0.970930  0.970930  0.970930   
100179       NaN       NaN       NaN  0.000000  0.959302  0.953488  0.953488   
100253       NaN       NaN       NaN       NaN  0.000000  0.976744  0.976744   
...          ...       ...       ...       ...       ...       ...       ... 

Итак, словарь, который выглядит так:

{((100120, 100051): 0.953488); ((1000138, 100051): 0.959302); ....}

Для создания словаря вы, вероятно, можете перебирать как строки, так и столбцы, например:

jacsim_values = {}
for i in jacsim_matrix2:
    for j in jacsim_matrix2:
        if jacsim_matrix[i][j] != 0:
            jacsim_values[i,j] = jacsim_matrix2[i][j]

Но я ищу что-то более эффективное. Это занимает довольно много времени для размера матрицы. Однако я не мог найти, как это сделать. Есть ли кто-нибудь, кто может мне помочь?


person kyra    schedule 18.05.2020    source источник


Ответы (1)


IIUC, DataFrame.stack (row, column) или < a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.unstack.html" rel="nofollow noreferrer">DataFrame.unstack (column, row) + DataFrame.to_dict

df.set_index('Material').rename(int, axis=1).unstack().to_dict()

{(100051, 100051): 0.0,
 (100051, 100120): nan,
 (100051, 100138): nan,
 (100051, 100179): nan,
 (100051, 100253): nan,
 (100120, 100051): 0.9534879999999999,
 (100120, 100120): 0.0,
 (100120, 100138): nan,
 (100120, 100179): nan,
 (100120, 100253): nan,
 (100138, 100051): 0.9593020000000001,
 (100138, 100120): 0.965116,
 (100138, 100138): 0.0,
 (100138, 100179): nan,
 (100138, 100253): nan,
 (100179, 100051): 0.9534879999999999,
 (100179, 100120): 0.9534879999999999,
 (100179, 100138): 0.9593020000000001,
 (100179, 100179): 0.0,
 (100179, 100253): nan,
 (100253, 100051): 0.9593020000000001,
 (100253, 100120): 0.9593020000000001,
 (100253, 100138): 0.97093,
 (100253, 100179): 0.9593020000000001,
 (100253, 100253): 0.0,
 (100265, 100051): 0.9534879999999999,
 (100265, 100120): 0.9593020000000001,
 (100265, 100138): 0.97093,
 (100265, 100179): 0.9534879999999999,
 (100265, 100253): 0.9767440000000001,
 (100281, 100051): 0.9534879999999999,
 (100281, 100120): 0.9593020000000001,
 (100281, 100138): 0.97093,
 (100281, 100179): 0.9534879999999999,
 (100281, 100253): 0.9767440000000001}
person ansev    schedule 18.05.2020