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)
我有一些大型数据集,其中包含30k列,行范围从10k至40k
我正在尝试使用之前制作的PCA转换数据集,然后根据各个数据框的索引将其与行标签'X_1'
结合起来。
由于它是一个大数据集,因此我决定使用块大小,以便可以限制每次使用的内存量。
联接对于第一组块有效,但是随后的块仅导致数据框的右侧部分为NAN。
我检查了数据框是否包含转换后的数据,并且确实包含值。
我没有加入转换后的数据,而是尝试加入了未转换的数据,它似乎可以正常工作,所以我不知道发生了什么。
我怀疑PCA转换已更改我的数据框的结构,从而导致其无法正确连接。
未转换的数据包含int64
和float64
dtypes列的混合,并存储为object
已转换的数据列全部为float64
,并且也存储为object
未处理的块数据具有对象float64
和int64
,并且也存储为object
我使用的是Python 3.6.4,我的模块版本为:
numpy (1.16.1)
pandas (0.24.1)
scikit-learn (0.20.2)
感谢我可以获得的任何帮助和意见。
谢谢!
答案 0 :(得分:1)
由于您正在join
列上执行index
,因此可以成功完成第一个块。
但是对于所有后继块,PCA
分解会重新生成index
,因此原始块的索引与已分解块的索引之间不匹配。
在分解之前,您可以对每个reset_index
进行操作,并且应该可以将其加入原始列:
_transformed = chunk[collist].reset_index(drop=True)
添加了drop=True
以获取更新的答案。 :)