2014-11-21 31 views

回答

4

您可以使用Pandas轻松创建3x3矩阵。从上面的数组中创建一个DataFrame 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的回答here

+0

这就是辉煌!这就是我正在寻找的,thatnks ajcr! – Chaos 2014-11-21 13:25:43

+0

很高兴它是有用的! – 2014-11-21 13:27:17

+0

还有一个问题,当我看到数据时有一个问题,我没有a-b和b-a对的协方差。相反,我只有一对值,你可以看到示例belwo: {'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]} 任何想法如何将其解析为协方差矩阵 – Chaos 2014-11-21 13:50:09