【发布时间】:2019-07-12 13:43:41
【问题描述】:
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)
感谢我能得到的任何帮助和意见。
提前致谢!
【问题讨论】:
-
看起来您正在加入
index,其中第一个块的值保持一致。但是第一个块之后的_transformed帧会重新生成索引,这就是为什么它在chunk[['X__1']]中找不到公共索引值的原因。 -
也许可以试试
_transformed = chunk[collist].reset_index()? -
你是对的!我虽然使用了
reset_index(drop = True)。reset_index重置后用旧索引添加另一列。所以 drop=True 删除该列。 -
发布一个答案,以便我接受它:)
标签: python pandas scikit-learn pca