【问题标题】:Is there a way to force SimpleImputer to return a pandas dataframe?有没有办法强制 SimpleImputer 返回熊猫数据框?
【发布时间】:2020-09-23 06:16:27
【问题描述】:

以下代码

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)

返回

array([[1. , 2. ],
       [2. , 1. ],
       [1.5, 0. ]])

有没有办法使用返回 pandas 数据框而不是 numpy 数组的 imputer?是否有 scikit-learn 实现?

【问题讨论】:

  • pd.DataFrame(SimpleImputer().fit_transform(df))
  • 这样的问题是列名丢失了,这在 scikit-learn 管道中效果不佳。
  • pandas 本身之外的大多数代码都使用df.values,该数组派生自框架。

标签: python pandas numpy scikit-learn


【解决方案1】:

SimpleImputer 返回一个转换后的数组,如docs 中所述。您可以构建一个新的数据框,也可以使用 imputter 的结果就地修改数据框:

df[:] = SimpleImputer().fit_transform(df)

【讨论】:

    【解决方案2】:

    一般sklearn中的所有转换函数都返回numpy数组。你需要养成使用的习惯

    pd.DataFrame(SimpleImputer().fit_transform(df), columns = df.columns)
    

    【讨论】:

    • 有没有办法使用df.update()就地更新?
    • 我不这么认为。 df.update 接受 pandas DataFrame 或 Series 作为参数。但在这里我们处理的是numpy array。
    【解决方案3】:

    如果您想保留列(例如,为了在后面的步骤中使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2019-06-05
      • 2021-04-10
      • 2021-02-04
      • 2017-08-28
      • 2020-12-24
      相关资源
      最近更新 更多