SimpleImputer使用两列来计算平均值

时间:2020-07-01 18:39:57

标签: python scikit-learn

我正在使用SimpleImputer和most_frequent来计算数据集中的缺失值。问题是这两列没有被独立处理,因此我在第一列中得到的最常用值用于替换第二列中的NaN,这显然使我的数据不正确。

下面的代码

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent',)
imputer.fit(X[:, 2:4])
X[:, 2:4] = imputer.transform(X[:, 2:4])

print(X[:, 3])

[2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 1517.0 2.0 1517.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2426.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0]

1 个答案:

答案 0 :(得分:0)

我一直在尝试使用dict comprehension和apply的许多不同方法,但是我似乎无法在一行代码中使用它。因此,我只能想到使用for循环来迭代要使用SimpleImputer的列并应用它:

X = pd.DataFrame({'A':[1,2,3,4,5,4,8],
                  'B':[2,2,2,2,2,2,np.nan],
                  'C':[6,5,np.nan,6,4,4,6],
                  'D':[1,2,3,np.nan,np.nan,3,4]})
cols = X.columns[2:]
imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
for i in cols:
  X[i] = imputer.fit_transform(X[i].values.reshape(-1,1))

填充第三列和第四列,但不填充第二列(这就是第二列中的NaN的原因。您也可以看到,无论2是数据框中最频繁的数字,则相应列中的最常用数字将填充这些列:

   A    B    C    D
0  1  2.0  6.0  1.0
1  2  2.0  5.0  2.0
2  3  2.0  6.0  3.0
3  4  2.0  6.0  3.0
4  5  2.0  4.0  3.0
5  4  2.0  4.0  3.0
6  8  NaN  6.0  4.0

我将做进一步调查以尝试在没有for循环的情况下应用此方法,并更新此答案。目前,这似乎可以解决问题。