【问题标题】:Remove Nan from Array of arrays从数组数组中删除 Nan
【发布时间】:2020-04-21 10:08:57
【问题描述】:

我想从数组中的一组数组中删除 NaN。我看到人们询问如何删除行/列的问题,但在这里我特别想删除这些元素。

这是我独立标准化每个数组的数据

sequence = array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9], 
                  [0.1, 0.2, 0.3, 0.4],
                  [0.5, 0.6, 0.7, 0.8, 0.9],
                  [9, 8, 7, 0.6, 0.5, 0.4]])

x = pd.DataFrame(sequence.tolist()).T.values

min_max_scaler = preprocessing.StandardScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled)
sequence_normalized = df.T

结果如下所示

我期望的是类似于

的输出
([[1.54, -1.16, -0.77, -0.38, 0.0, 0.38, 0.77, 1.16, 1.54], 
                  [-1.34, -0.44, 0.44, 1.36],
                  [-1.41, 0.71, 0.0, 0.71, 1.41],
                  [1.25, 0.98, 0.72, -0.96, 0.98, -1.01]])

【问题讨论】:

    标签: python pandas numpy scikit-learn


    【解决方案1】:
    In [342]: sequence = np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],  
         ...:                   [0.1, 0.2, 0.3, 0.4], 
         ...:                   [0.5, 0.6, 0.7, 0.8, 0.9], 
         ...:                   [9, 8, 7, 0.6, 0.5, 0.4]]) 
         ...:  
         ...: x = pd.DataFrame(sequence.tolist()).T.values 
         ...:  
         ...: min_max_scaler = preprocessing.StandardScaler() 
         ...: x_scaled = min_max_scaler.fit_transform(x)                            
    

    sequence 是一个列表数组:

    In [343]: sequence                                                              
    Out[343]: 
    array([list([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]),
           list([0.1, 0.2, 0.3, 0.4]), list([0.5, 0.6, 0.7, 0.8, 0.9]),
           list([9, 8, 7, 0.6, 0.5, 0.4])], dtype=object)
    

    将其放入数据框中(然后退出)会生成一个带有nan 填充的二维数组。通过缩放运行:

    In [344]: x_scaled                                                              
    Out[344]: 
    array([[-1.54919334, -1.34164079, -1.41421356,  1.25177113],
           [-1.161895  , -0.4472136 , -0.70710678,  0.98824036],
           [-0.77459667,  0.4472136 ,  0.        ,  0.7247096 ],
           [-0.38729833,  1.34164079,  0.70710678, -0.96188729],
           [ 0.        ,         nan,  1.41421356, -0.98824036],
           [ 0.38729833,         nan,         nan, -1.01459344],
           [ 0.77459667,         nan,         nan,         nan],
           [ 1.161895  ,         nan,         nan,         nan],
           [ 1.54919334,         nan,         nan,         nan]])
    

    另一种方法是让每个列表自己通过缩放:

    In [345]: [min_max_scaler.fit_transform(np.reshape(alist,(-1,1))).ravel() for al
         ...: ist in sequence]                                                      
    Out[345]: 
    [array([-1.54919334, -1.161895  , -0.77459667, -0.38729833,  0.        ,
             0.38729833,  0.77459667,  1.161895  ,  1.54919334]),
     array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079]),
     array([-1.41421356, -0.70710678,  0.        ,  0.70710678,  1.41421356]),
     array([ 1.25177113,  0.98824036,  0.7247096 , -0.96188729, -0.98824036,
            -1.01459344])]
    

    ===

    有一组numpy.nan... 函数对数组进行操作,省略了nan。使用其中的实用函数,我们可以从x_scaled 的每一列中删除nan

    In [349]: [np.lib.nanfunctions._remove_nan_1d(col)[0] for col in  x_scaled.T]   
    Out[349]: 
    [array([-1.54919334, -1.161895  , -0.77459667, -0.38729833,  0.        ,
             0.38729833,  0.77459667,  1.161895  ,  1.54919334]),
     array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079]),
     array([-1.41421356, -0.70710678,  0.        ,  0.70710678,  1.41421356]),
     array([ 1.25177113,  0.98824036,  0.7247096 , -0.96188729, -0.98824036,
            -1.01459344])]
    

    或者我们可以做同样的事情直接应用np.isnan

    In [351]: [col[~np.isnan(col)] for col in  x_scaled.T]                          
    Out[351]: 
    [array([-1.54919334, -1.161895  , -0.77459667, -0.38729833,  0.        ,
             0.38729833,  0.77459667,  1.161895  ,  1.54919334]),
     array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079]),
     array([-1.41421356, -0.70710678,  0.        ,  0.70710678,  1.41421356]),
     array([ 1.25177113,  0.98824036,  0.7247096 , -0.96188729, -0.98824036,
            -1.01459344])]
    

    【讨论】:

      【解决方案2】:

      pandas 数据框行的大小需要相同,因此您唯一的选择是转换为字符串并将nan 值替换为空字符串。这些位置需要有东西。如果不是nansomething 可以是空字符串。

      sequence_normalized.astype(str).replace('nan', '')
      

      【讨论】:

      • 好吧,我要的是数组数组或列表数组——不是数据框。
      猜你喜欢
      • 2012-07-22
      • 2018-12-21
      • 1970-01-01
      • 2020-11-05
      • 2019-04-15
      • 2019-12-22
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多