【问题标题】:Python : Merging/joining Dataframe after PCA transform results in NANPython:PCA转换后合并/加入数据框导致NAN
【发布时间】: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


【解决方案1】:

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

您可以在分解之前对每个每个都执行reset_index,并且您应该能够将其加入原始列:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2021-11-11
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多