如何有效地将数组传递给数据框?

时间:2017-03-23 11:14:47

标签: python pandas dataframe pca

我在数据帧DF1的列上运行PCA,它返回一个主要组件数组。 我想创建一个数据框DF2,它与DF1具有相同的索引,并且包含主成分数组中的值。

 DF1=
                   v1       v2       v3
     2014-01-02   0.58     0.89    -0.19
     2014-01-03  -1.96     0.59     1.24
     2014-01-04   2.06    -0.15     3.54
     2014-01-05   0.31     1.25    -2.42
     2014-01-06   1.31     0.33     0.89
     ...          ...       ...      ...

PCs=
array([[ 0.14411173, -0.25557942,  0.08295314, ..., -0.24914411,
        -0.35242784,  0.17412245],
       [ 0.15391876, -0.3063616 , -0.62369197, ...,  0.18915513,
        -0.39056901,  0.23227158],
       [-0.00493105, -0.31936978,  0.35831582, ..., -0.2781707 ,
        -0.29810411,  0.27513239],
       [-0.5870741 ,  0.16183593,  0.10528634, ..., -0.21776753,
        -0.30365561,  0.17920256],
       [-0.6353732 , -0.28649561, -0.21702067, ...,  0.36312823,
        -0.11915208, -0.36003616]])

(在PC阵列中,每一行都是PC) 获得

DF2=
                          PC1         PC2         PC3
         2014-01-02   0.14411173  -0.15391876    ...
         2014-01-03   0.25557942  -0.39056901
         2014-01-04   ...
         2014-01-05   
         2014-01-06   
         ...          ...       ...      ...
  1. 如何有效地将PC阵列放入数据框?
  2. 有没有比在数据帧上运行PCA然后将数组合并到新数据框中更好,更有效的方式来获得我想要的东西? (例如,将PC直接放入数据框中的方法)

1 个答案:

答案 0 :(得分:1)

您可以创建新的pandas DataFrame,同时明确传递df1的索引并转置pca数组。

首先创建一些虚拟数据:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.random(size=(3, 5)), index=pd.date_range(start="2014-01-02", periods=3))
print(df1)

                   0         1         2         3         4
2014-01-02  0.875032  0.853087  0.686504  0.682114  0.199243
2014-01-03  0.522381  0.606048  0.398451  0.799883  0.030091
2014-01-04  0.489119  0.997239  0.021816  0.307509  0.099752

# create dummy pca results
pca = np.random.random(size=(2, 3))
print(pca)

[[ 0.42791681  0.56512179  0.44731657]
 [ 0.10763007  0.35437208  0.79968957]]

现在,构建列名,并在传递索引和列以及转置的pca数组时创建pandas DataFrame:

columns = ["PC{}".format(x + 1) for x in range(pca.shape[0])]
df2 = pd.DataFrame(pca.T, index=df1.index, columns=columns)
print(df2)

                 PC1       PC2
2014-01-02  0.427917  0.107630
2014-01-03  0.565122  0.354372
2014-01-04  0.447317  0.799690

回答第二个问题:我认为没有更有效的方法直接创建DataFrame