Python:PCA转换后合并/合并Dataframe会导致NAN

时间:2019-02-19 05:58:49

标签: python pandas scikit-learn pca

import pickle
import numpy as np 
import pandas as pd
from sklearn.externals import joblib
from sklearn.decomposition import PCA
PCA = joblib.load('pcawithstandard.pkl')

with open('collist.pickle', 'rb') as handle:
    collist = pickle.load(handle)

for chunk in pd.read_csv('fortest.csv', chunksize = 5):

    _transformed = chunk[collist]
    _transformed = PCA.transform(_transformed)
    _transformed = pd.DataFrame(data=_transformed)

    _tempdata = chunk[['X__1']].join(_transformed)
    print(_tempdata)

enter image description here

我有一些大型数据集,其中包含30k列,行范围从10k至40k 我正在尝试使用之前制作的PCA转换数据集,然后根据各个数据框的索引将其与行标签'X_1'结合起来。

由于它是一个大数据集,因此我决定使用块大小,以便可以限制每次使用的内存量。

联接对于第一组块有效,但是随后的块仅导致数据框的右侧部分为NAN。

我检查了数据框是否包含转换后的数据,并且确实包含值。

我没有加入转换后的数据,而是尝试加入了未转换的数据,它似乎可以正常工作,所以我不知道发生了什么。

我怀疑PCA转换已更改我的数据框的结构,从而导致其无法正确连接。

未转换的数据包含int64float64 dtypes列的混合,并存储为object

已转换的数据列全部为float64,并且也存储为object

未处理的块数据具有对象float64int64,并且也存储为object

我使用的是Python 3.6.4,我的模块版本为:

numpy (1.16.1)
pandas (0.24.1)
scikit-learn (0.20.2)

感谢我可以获得的任何帮助和意见。

谢谢!

1 个答案:

答案 0 :(得分:1)

由于您正在join列上执行index,因此可以成功完成第一个块。 但是对于所有后继块,PCA分解会重新生成index,因此原始块的索引与已分解块的索引之间不匹配。

在分解之前,您可以对每个reset_index进行操作,并且应该可以将其加入原始列:

_transformed = chunk[collist].reset_index(drop=True)

添加了drop=True以获取更新的答案。 :)