【问题标题】:Imputing only the numerical values using sci-kit learn使用 scikit learn 仅输入数值
【发布时间】:2019-08-03 02:42:28
【问题描述】:

所以,我有一个 DataFrame,其中包含分类和数值的混合值,当前是 12345 行乘 171 列。

我在分类变量和数值中都有缺失值,我想在其中估算这些值。对于数值列,我正在执行以下操作;

import pandas as pd
import numpy as np

data = pd.read_csv('filepath')

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data = imp.fit_transform(data)

然后我得到以下错误

ValueError: could not convert string to float: 'USD'

我理解这是因为我正在使用 sci-kit learns imputer with strategy = mean 这与分类变量不兼容。我宁愿不必遍历每一列并手动提取数值,所以我正在寻找一种方法,我可以只在数值列上执行此插补。

【问题讨论】:

    标签: python scikit-learn preprocessor


    【解决方案1】:

    如果您使用 panda 的 categorical encoding 功能,这一切都可以非常简单地处理。然而,我很少发现自己拥有正确编码的数据,并且宁愿拥有一个强大的解决方案而不是依赖纯熊猫。

    这就是我要做的。

    categorical_columns = []
    numeric_columns = []
    for c in data.columns:
        if data[c].map(type).eq(str).any(): #check if there are any strings in column
            categorical_columns.append(c)
        else:
            numeric_columns.append(c)
    
    #create two DataFrames, one for each data type
    data_numeric = data[numeric_columns]
    data_categorical = pd.DataFrame(data[categorical_columns])
    
    
    from sklearn.preprocessing import Imputer
    imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
    data_numeric = pd.DataFrame(imp.fit_transform(data_numeric), columns = data_numeric.columns) #only apply imputer to numeric columns
    
    
    #you could do something like one-hot-encoding of data_categorical here
    
    #join the two masked dataframes back together
    data_joined = pd.concat([data_numeric, data_categorical], axis = 1)
    

    【讨论】:

    • 要考虑的另一件事(帖子中未提及)是您拥有以整数表示的分类数据(例如集群或组)的情况。在这种情况下,在for c in data.columns 循环中添加一行以查找每列中唯一值的数量,并可能将它们添加到第三个列列表中可能会很有用。如果一列全是 0 和 1,插补 0.5 的平均值是没有用的!
    • 我自己的想法与此答案相同。也感谢上面的评论。这也适用于我的情况。
    【解决方案2】:

    您可以使用 select_dtypes 方法选择所有数字列:

    numeric_columns = data.select_dtypes(include='number').columns
    imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
    data[numeric_columns] = pd.DataFrame(imp.fit_transform(data[numeric_columns]), columns=numeric_columns)
    

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2017-10-11
      • 2014-01-27
      • 1970-01-01
      • 2019-02-22
      • 2018-04-30
      • 1970-01-01
      • 2016-01-01
      • 2019-12-05
      相关资源
      最近更新 更多