Заполнить матрицу транспонировать версия

у меня есть матрицы парных:

>>> m
     a    b    c   d
a  1.0  NaN  NaN NaN
b  0.5  1.0  NaN NaN
c  0.6  0.0  1.0 NaN
d  0.5  0.4  0.3 1.0

Я хочу заменить NaN в правом верхнем углу теми же значениями, что и в левом нижнем углу:

>>> m2
     a    b    c    d
a  1.0  0.5  0.6  0.5
b  0.5  1.0  0.0  0.4
c  0.6  0.0  1.0  0.3
d  0.5  0.4  0.3  1.0

Я могу сделать это путем замены столбцов и индексов:

cols = m.columns
idxs = m.index

for c in cols:
    for i in idxs:
        m[i][c] = m[c][i]

но это медленно с моими фактическими данными, и я уверен, что есть способ сделать это за один шаг. Я знаю, что могу создать верхнюю правую версию с "m.T " но я не знаю, как заменить NaN на значения, отличные от NaN, чтобы получить полную матрицу. Есть наверное, одношаговый способ сделать это в numpy, но я не знаю из матричной алгебры.

3 ответов


как о (docs):

>>> df.combine_first(df.T)
     a    b    c    d
a  1.0  0.5  0.6  0.5
b  0.5  1.0  0.0  0.4
c  0.6  0.0  1.0  0.3
d  0.5  0.4  0.3  1.0

вот один альтернативный способ:

>>> m[np.triu_indices_from(m, k=1)] = m.T[np.triu_indices_from(m, k=1)]
>>> m
array([[ 1. ,  0.5,  0.6,  0.5],
       [ 0.5,  1. ,  0. ,  0.4],
       [ 0.6,  0. ,  1. ,  0.3],
       [ 0.5,  0.4,  0.3,  1. ]])

m[np.triu_indices_from(m, k=1)] возвращает значения выше диагонали m и присваивает им значения значений выше диагонали транспонирования m.


С numpy.isnan():

>>> m[np.isnan(m)] = m.T[np.isnan(m)]
>>> m
     a    b    c    d
a  1.0  0.5  0.6  0.5
b  0.5  1.0  0.0  0.4
c  0.6  0.0  1.0  0.3
d  0.5  0.4  0.3  1.0

или лучше, с panda.isnull():

>>> m[pd.isnull(m)] = m.T[pd.isnull(m)]
>>> m
     a    b    c    d
a  1.0  0.5  0.6  0.5
b  0.5  1.0  0.0  0.4
c  0.6  0.0  1.0  0.3
d  0.5  0.4  0.3  1.0

что, наконец, эквивалентно решению @DSM!