代码之家  ›  专栏  ›  技术社区  ›  Ahmad.Masood

执行standardscaler后将nan分配给-1

  •  1
  • Ahmad.Masood  · 技术社区  · 6 年前

    我想 标准定标器 (通过sk learn)某些数据帧,其中包含许多 值,并在执行此scaler移位之后,我要分配所有 NaN 到1。我们知道standardscaler不能处理nan值,这怎么可能呢?

    如果有其他解决方案(不依赖于 科学软件学习 )也请提及这一点。

    df = pd.DataFrame(StandardScaler().fit_transform(values_to_scale.values))
    

    我收到以下错误消息:

    ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Gambit1614    6 年前

    处理nan值并不是那么简单。在进一步处理nan值之前,需要对数据进行分析。有多种方法可以处理这些丢失的值(以下不是详尽的列表):

    • 忽略其他缺少的值 :此方法的问题是,缺少的行可能在其他列中包含重要信息,忽略它们将导致不完整的分析
    • 用另一个值替换它们 :这是常用的方法之一,但是选择要替换的值将影响您的总体分析。您可以用say mean替换它们,或者说一个占位符值(比如-1),您知道这个值在整个列中都不会出现。

    • 使用回归替换值

    • **使用knn替换值**

    你可以看一下下面的链接,得到一个更好的主意

    另外,你可以看看 official sklearn documentation for imputing missing values .

    更新 :执行标准标量时,可以忽略NaN值,如下所示

    import numpy as np    
    import pandas as pd
    from sklearn.preprocessing import StandardScaler
    
    #Create a dataframe
    df = pd.DataFrame({'col1': [0, np.nan, 2, 3, np.nan, 4, 5, np.nan, 6, 7, np.nan]})
    
    #Get the index of null values
    null_values = d['col1'].isnull()
    
    #Perform standard scalar on only non-NaN values
    df.loc[~null_values, ['col1']] = StandardScaler().fit_transform(df.loc[~null_values, ['col1']])
    

    产量

        col1
    0   -1.728498
    1   NaN
    2   -0.832240
    3   -0.384111
    4   NaN
    5   0.064018
    6   0.512148
    7   NaN
    8   0.960277
    9   1.408406
    10  NaN
    

    然后使用 df.fillna

    df.fillna(-1)
    

    出局

        col1
    0   -1.728498
    1   -1.000000
    2   -0.832240
    3   -0.384111
    4   -1.000000
    5   0.064018
    6   0.512148
    7   -1.000000
    8   0.960277
    9   1.408406
    10  -1.000000