使用 scikit learn 仅估算数值

Imputing only the numerical values using sci-kit learn

所以,我有一个 DataFrame,其中包含目前 12345 行乘 171 列的分类值和数值的混合。

我在分类变量和数字变量中都缺少值,我想在其中估算值。对于数字列,我正在执行以下操作;

import pandas as pd
import numpy as np

data = pd.read_csv('filepath')

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data = imp.fit_transform(data)

然后我得到以下错误

ValueError: could not convert string to float: 'USD'

我的理解是因为我正在使用 sci-kit 学习带有 strategy = mean 的 imputer,它与分类变量不兼容。我宁愿不必遍历每一列并手动提取数值,所以我正在寻找一种方法,我可以仅在数值列上执行此插补。

如果您使用 panda 的 categorical encoding 功能,这一切都可以非常简单地处理。然而,我很少发现自己有正确编码的数据,宁愿有一个健壮的解决方案也不愿依赖纯粹的 pandas。

这是我会做的。

categorical_columns = []
numeric_columns = []
for c in data.columns:
    if data[c].map(type).eq(str).any(): #check if there are any strings in column
        categorical_columns.append(c)
    else:
        numeric_columns.append(c)

#create two DataFrames, one for each data type
data_numeric = data[numeric_columns]
data_categorical = pd.DataFrame(data[categorical_columns])


from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data_numeric = pd.DataFrame(imp.fit_transform(data_numeric), columns = data_numeric.columns) #only apply imputer to numeric columns


#you could do something like one-hot-encoding of data_categorical here

#join the two masked dataframes back together
data_joined = pd.concat([data_numeric, data_categorical], axis = 1)

您可以使用 select_dtypes 方法 select 所有数字列:

numeric_columns = data.select_dtypes(include='number').columns
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data[numeric_columns] = pd.DataFrame(imp.fit_transform(data[numeric_columns]), columns=numeric_columns)