如何防止 Scikit-Learn Imputer 删除 NaN 行?

How to prevent Scikit-Learn Imputer from removing NaN rows?

我的一个项目正在使用 scikit-learn imputer 来处理 NaN 值,但是,它似乎删除了完全由 NaN 组成的行,如以下代码片段所示:

tmp = [[math.nan, 3.0],[math.nan, 5.0],[math.nan, math.nan]]

imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp_tmp = imp.fit_transform(np.asarray(tmp, dtype=np.float_))

print(np.asarray(tmp, dtype=np.float_))
print(np.asarray(imp_tmp, dtype=np.float_))

assert len(np.asarray(tmp, dtype=np.float_)[0]) == len(np.asarray(imp_tmp, dtype=np.float_)[0])

特别是断言失败。有谁知道是否记录了这种行为以及如何预防这种行为?我在文档中找不到有关删除 NaN 行的输入的任何信息:Simple Imputer

documentation 中所述,仅包含缺失值的列将被丢弃,除非 strategy='constant':

Columns which only contained missing values at fit are discarded upon transform if strategy is not “constant”.

这意味着在您的情况下,第一列被丢弃,您只剩下第二列,其中最后一行中的缺失值被前两列中的非缺失值的平均值正确替换行数:

import math
import numpy as np
from sklearn.impute import SimpleImputer

tmp = [[math.nan, 3.0],[math.nan, 5.0],[math.nan, math.nan]]
print(np.asarray(tmp, dtype=np.float_))
# [[nan  3.]
#  [nan  5.]
#  [nan nan]]

print(np.asarray(tmp, dtype=np.float_).shape)
# (3, 2)

imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp_tmp = imp.fit_transform(np.asarray(tmp, dtype=np.float_))
print(np.asarray(imp_tmp, dtype=np.float_))
# [[3.]
#  [5.]
#  [4.]]

print(np.asarray(imp_tmp, dtype=np.float_).shape)
# (3, 1)