Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从协方差的数据帧创建numpy协方差矩阵_Python_Pandas_Numpy_Matrix_Vectorization - Fatal编程技术网

Python 从协方差的数据帧创建numpy协方差矩阵

Python 从协方差的数据帧创建numpy协方差矩阵,python,pandas,numpy,matrix,vectorization,Python,Pandas,Numpy,Matrix,Vectorization,我有以下pandas.DataFrame对象,它提供了因子之间的协方差: import pandas as pd df = pd.DataFrame({"factor1": ["A", "A", "A", "B", "B", "C"], "factor2": ["A", "B", "C", "B", "C", "C"], "covar": [-1.2, -1, 2, 3.4, -4, 6.2]}) 我的目标是将数据帧

我有以下pandas.DataFrame对象,它提供了因子之间的协方差:

import pandas as pd

df = pd.DataFrame({"factor1": ["A", "A", "A", "B", "B", "C"],
                   "factor2": ["A", "B", "C", "B", "C", "C"],
                   "covar": [-1.2, -1, 2, 3.4, -4, 6.2]})
我的目标是将数据帧重新格式化为半正定协方差numpy.ndarray

我已经制定了一个有效的解决方案,但是,它的速度非常缓慢:

unique_factors = df.factor1.unique()
F = pd.DataFrame(columns=unique_factors, index=unique_factors)
for index, row in df.iterrows():
    F.loc[row["factor1"], row["factor2"]] = row["covar"]**2
    F.loc[row["factor2"], row["factor1"]] = row["covar"]**2 #inefficient
F = F.to_numpy()
其输出为:

[[1.44 1.0                4.0               ]
 [1.0  11.559999999999999 16.0              ]
 [4.0  16.0               38.440000000000005]]
我希望我能利用numpy的本土方法更有效地实现我的目标。至少我希望能够删除注释的行
#efficible
,并反映关于对角线的上三角矩阵。如果您有任何帮助,我们将不胜感激。

s=df.pivot(*df.columns)**2
s=s.fillna(s.T)

Out[230]: 
factor2     A      B      C
factor1                    
A        1.44   1.00   4.00
B        1.00  11.56  16.00
C        4.00  16.00  38.44
就你而言

s=df.pivot(*df.columns)**2
s=s.fillna(s.T)

Out[230]: 
factor2     A      B      C
factor1                    
A        1.44   1.00   4.00
B        1.00  11.56  16.00
C        4.00  16.00  38.44

这要快得多⁠—非常感谢。我可以问一下
df.columns
前面的星号有什么作用吗?@Clade,即获取要列出的列名,并将这些信息作为索引列值传递给pivot这要快得多⁠—非常感谢。我可以问一下
df.columns
前面的星号是什么吗?@Clade,即获取要列出的列名,并将这些信息作为索引列值传递给pivot