【问题标题】:Imputer on some Dataframe columns in Python在 Python 中的某些 Dataframe 列上进行插补
【发布时间】:2016-11-29 18:22:26
【问题描述】:

我正在学习如何在 Python 上使用 Imputer。

这是我的代码:

df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
["L", np.nan, "gray", "class 2", 20],
["XL", 10, "blue", "class 2", 19],
["M", np.nan, "orange", "class 1", 17],
["M", 11, "green", "class 3", np.nan],
["M", 7, "red", "class 1", 22]])

df.columns=["size", "price", "color", "class", "boh"]

from sklearn.preprocessing import Imputer

imp=Imputer(missing_values="NaN", strategy="mean" )
imp.fit(df["price"])

df["price"]=imp.transform(df["price"])

但是,这会引发以下错误: ValueError:值的长度与索引的长度不匹配

我的代码有什么问题???

感谢您的帮助

【问题讨论】:

    标签: python scikit-learn missing-data imputation


    【解决方案1】:

    我想你想为 imputer 指定轴,然后转置它返回的数组:

    import pandas as pd
    import numpy as np
    
    df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
    ["L", np.nan, "gray", "class 2", 20],
    ["XL", 10, "blue", "class 2", 19],
    ["M", np.nan, "orange", "class 1", 17],
    ["M", 11, "green", "class 3", np.nan],
    ["M", 7, "red", "class 1", 22]])
    
    df.columns=["size", "price", "color", "class", "boh"]
    
    from sklearn.preprocessing import Imputer
    
    imp=Imputer(missing_values="NaN", strategy="mean",axis=1 ) #specify axis
    q = imp.fit_transform(df["price"]).T #perform a transpose operation
    
    
    df["price"]=q
    print df 
    

    【讨论】:

    • 谢谢瑞恩。真的很有用。
    • 不幸的是,这对我不起作用:( ValueError: Expected 2D array, got 1D array instead:
    【解决方案2】:

    这是因为Imputer 通常与 DataFrames 而不是 Series 一起使用。一个可能的解决方案是:

    imp=Imputer(missing_values="NaN", strategy="mean" )
    imp.fit(df[["price"]])
    df["price"]=imp.transform(df[["price"]]).ravel()
    
    # Or even 
    imp=Imputer(missing_values="NaN", strategy="mean" )
    df["price"]=imp.fit_transform(df[["price"]]).ravel()
    

    【讨论】:

    • 这里为什么需要ravel()?没有它似乎返回正确的类型
    • 1.如果您正在制作二维 df[["price"]] ,则不需要 ravel() 。为了让 Imputer 和 fit_transform 工作,我们只需要二维。 df[["price"]] 将数据转换为二维。格式(行数,1)。 2. 如果您使用 1 维 - df["price"],则以下内容仍然有效,但也会返回错误 - ValueError: Expected 2D array, got 1D array instead: array df["price"]=imp.fit_transform (df["price"]).ravel()
    【解决方案3】:

    简单的解决方案是提供一个二维数组

    df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
    ["L", np.nan, "gray", "class 2", 20],
    ["XL", 10, "blue", "class 2", 19],
    ["M", np.nan, "orange", "class 1", 17],
    ["M", 11, "green", "class 3", np.nan],
    ["M", 7, "red", "class 1", 22]])
    
    df.columns=["size", "price", "color", "class", "boh"]
    
    from sklearn.preprocessing import Imputer
    
    imp=Imputer(missing_values="NaN", strategy="mean" )
    imp.fit(df[["price"]])
    
    df["price"]=imp.transform(df[["price"]])
    
    df['boh'] = imp.fit_transform(df[['price']])
    

    这是你的数据框

    Cleaned DataFrame

    【讨论】:

      【解决方案4】:

      这里是 Simple Imputer 的文档。对于 fit 方法,它将类数组或稀疏矩阵作为输入参数。 你可以试试这个:

      imp.fit(df.iloc[:,1:2]) 
      df['price']=imp.transform(df.iloc[:,1:2])
      

      提供索引位置以适应方法,然后应用变换。

      >>> df
         size  price   color    class   boh
       0  XXL    8.0   black  class 1  22.0
       1    L    9.0    gray  class 2  20.0
       2   XL   10.0    blue  class 2  19.0
       3    M    9.0  orange  class 1  17.0
       4    M   11.0   green  class 3   NaN
       5    M    7.0     red  class 1  22.0
      

      你可以为boh做同样的事情

      imp.fit(df.iloc[:,4:5])
      df['price']=imp.transform(df.iloc[:,4:5])
      >>> df
          size  price   color    class   boh
       0  XXL    8.0   black  class 1  22.0
       1    L    9.0    gray  class 2  20.0
       2   XL   10.0    blue  class 2  19.0
       3    M    9.0  orange  class 1  17.0
       4    M   11.0   green  class 3  20.0
       5    M    7.0     red  class 1  22.0
      

      如果我错了,请纠正我。建议将不胜感激。

      【讨论】:

        猜你喜欢
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多