有没有办法强制 SimpleImputer 返回 pandas 数据帧?

Dav*_*sip 5 python numpy pandas scikit-learn

下面的代码

from sklearn.impute import SimpleImputer
import pandas as pd

df = pd.DataFrame(dict(
    x=[1, 2, np.nan],
    y=[2, np.nan, 0]
))

SimpleImputer().fit_transform(df)
Run Code Online (Sandbox Code Playgroud)

退货

array([[1. , 2. ],
       [2. , 1. ],
       [1.5, 0. ]])
Run Code Online (Sandbox Code Playgroud)

有没有办法使用返回 pandas 数据帧而不是 numpy 数组的输入器?有没有 scikit-learn 实现?

yat*_*atu 7

返回一个转换后的数组,如文档SimpleImputer中所述。您可以构造一个新的数据框,也可以使用输入器的结果就地修改数据框,如下所示:

df[:] = SimpleImputer().fit_transform(df)
Run Code Online (Sandbox Code Playgroud)


noc*_*mbi 4

如果您想保留列(例如,为了在后面的步骤中使用 ColumnTransformers),您可以创建一个包装器SimpleImputer

df = pd.DataFrame({"A": [1, 2, np.NaN], "B": [3, np.NaN, 4], "C": [np.NaN, 5, 6]})

class PandasSimpleImputer(SimpleImputer):
    """A wrapper around `SimpleImputer` to return data frames with columns.
    """

    def fit(self, X, y=None):
        self.columns = X.columns
        return super().fit(X, y)

    def transform(self, X):
        return pd.DataFrame(super().transform(X), columns=self.columns)


PandasSimpleImputer().fit_transform(df)

>>>
    A   B   C
0   1.0 3.0 5.5
1   2.0 3.5 5.0
2   1.5 4.0 6.0
Run Code Online (Sandbox Code Playgroud)