Python: создание ковариационной матрицы из списков



Есть ли самый быстрый способ перейти от следующих трех списков к ковариационной матрице в Python (массив numpy)?

Fac2 Fac1  VarCovar
   a    a       1.4
   a    b       0.7
   a    c       0.3
   b    a       0.7
   b    b       1.8
   b    c       6.3
   c    a       0.3
   c    b       6.3
   c    c       2.4
139   1  

1 ответ:

Вы можете легко создать матрицу 3x3, используя панд. Создайте фрейм данных df из указанного выше массива и сделайте разворот по третьему столбцу с помощью pivot_table.

Например, если у вас есть следующий словарь d списков:

{'Fac1': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
 'Fac2': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
 'VarCovar': [1.4, 0.7, 0.3, 0.7, 1.8, 6.3, 0.3, 6.3, 2.4]}

Создайте фрейм данных следующим образом:

df = pd.DataFrame(d)

А затем:

>>> df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar')
Fac2    a    b    c
Fac1               
a     1.4  0.7  0.3
b     0.7  1.8  6.3
c     0.3  6.3  2.4

С помощью атрибута values в конце возвращает массив NumPy из таблицы:

>>> df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar').values
array([[ 1.4,  0.7,  0.3],
       [ 0.7,  1.8,  6.3],
       [ 0.3,  6.3,  2.4]])

Если у вас нет всех пар, вы можете действовать таким же образом и заполните недостающие значения транспонированной индексной парой:

>>> d = {'Fac1': ['a', 'b', 'c' , 'b', 'c', 'c'], 
         'Fac2': ['a', 'a', 'a' , 'b', 'b', 'c'], 
         'VarCovar': [1.4, 0.7, 0.3, 1.8, 6.3, 2.4]}
>>> df = pd.DataFrame(d)
>>> table = df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar')
>>> table.combine_first(table.T)
Fac2    a    b    c
Fac1               
a     1.4  0.7  0.3
b     0.7  1.8  6.3
c     0.3  6.3  2.4

(я взял идею использования combine_first из ответа DSM здесь )

    Ничего не найдено.

Добавить ответ:
Отменить.