使用 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)
所以,我有一个 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)