如果策略失败,如何将 NaN 值归因于默认值?

How to impute NaN values to a default value if strategy fails?

问题

我正在使用 sklearn.preprocessing.Imputer class 在列上使用 mean 策略来估算 NaN 值,即轴=0。我的问题是一些需要估算的数据 only 在它的列中有 NaN 值,例如当只有一个条目时。

import numpy as np
import sklearn.preprocessing import Imputer

data = np.array([[1, 2, np.NaN]])
data = Imputer().fit_transform(data)

这给出了 array([[1., 2.]])

的输出

很公平,显然 Imputer 无法计算一组全为 NaN 的值的平均值。但是,我不想删除该值,而是想回退到默认值,在我的例子中是 0.

当前方法

为了解决这个问题,我首先检查整个列是否只包含 NaN 值,如果是,则将它们替换为我的默认值 0:

# Loop over all columns in data
for column in data.T:
    # Check if all values in column are NaN
    if all(np.isnan(value) for value in column):
        # Fill the column with default value 0
        column.fill(0)

问题

如果整个轴仅包含 NaN 值,是否有更优雅的方法来估算默认值?

这是一个矢量化解决方案,可以在 for 循环中完成您正在做的事情,因此应该会快得多

default = 0
data[:, np.isnan(data).all(axis=0)] = default

然后您可以将 Imputer().fit_transform() 方法应用于新的 data


例子

data = np.array([[np.nan, 1, 1], [np.nan]*3, [1, 2, 3]]).T

看起来像

[[nan nan  1.]
 [ 1. nan  2.]
 [ 1. nan  3.]]

应用我们的方法删除 nans

default = 0
data[:, np.isnan(data).all(axis=0)] = default

我们得到

[[nan  0.  1.]
 [ 1.  0.  2.]
 [ 1.  0.  3.]]