使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列

Posted

技术标签:

【中文标题】使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列【英文标题】:Impute entire DataFrame (all columns) using Scikit-learn (sklearn) without iterating over columns 【发布时间】:2016-02-13 03:37:51 【问题描述】:

我想估算 pandas DataFrame 上的所有列...我能想到的唯一方法是逐列如下所示...

有没有一种操作可以让我在不遍历列的情况下估算整个 DataFrame?

#!/usr/bin/python
from sklearn.preprocessing import Imputer
import numpy as np
import pandas as pd

#Imputer
fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1)

#Model 1
DF = pd.DataFrame([[0,1,np.nan],[2,np.nan,3],[np.nan,2,5]])
DF.columns = "c1.c2.c3".split(".")
DF.index = "i1.i2.i3".split(".")

#Impute Series
imputed_DF = DF
for col in DF.columns:
    imputed_column = fill_NaN.fit_transform(DF[col]).T
    #Fill in Series on DataFrame
    imputed_DF[col] = imputed_column

#DF
#c1  c2  c3
#i1   0   1 NaN
#i2   2 NaN   3
#i3 NaN   2   5

#imputed_DF
#c1   c2  c3
#i1   0  1.0   4
#i2   2  1.5   3
#i3   1  2.0   5

【问题讨论】:

【参考方案1】: 如果任何列包含 NA,

df.mean() 将返回 NA,因此使 df.fillna() 无法按预期运行。正确的方法是使用 np.nanmean()

【讨论】:

【参考方案2】:

除非您出于某种原因特别需要使用 sklearn Imputer,否则在我看来,一个更简单的选择就是这样做:

df = df.fillna(df.mean())

【讨论】:

这可能就是我现在要做的。也许类似于df[df.isnull()] = x。我认为我实际上不会在现实世界的数据集中impute 任何东西。【参考方案3】:

如果你想要meanmedian,你可以这样做:

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1)
imputed_DF = pd.DataFrame(fill_NaN.fit_transform(DF))
imputed_DF.columns = DF.columns
imputed_DF.index = DF.index

如果你想用 0 或其他东西填充它们,你总是可以这样做:

DF[DF.isnull()] = 0

【讨论】:

我发现了很多不好的例子,这是第一个对我有意义的例子。谢谢! 谢谢!我没有从我的一个答案中得到任何好的反馈,所以我真的很感激。 +1 包括在原始 numpy 数组从任何 sklearn Imputer 出来之后,使用原始列名和索引恢复 DataFrame 类型的步骤

以上是关于使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列的主要内容,如果未能解决你的问题,请参考以下文章

skLearn 支持向量机

ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素

Sklearn K均值聚类

使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列

sklearn (scikit-learn) 逻辑回归包——设置训练的分类系数。

Python---scikit-learn(sklearn)模块