【问题标题】:Numpy: Drop rows with all nan or 0 valuesNumpy:删除所有 nan 或 0 值的行
【发布时间】:2014-03-28 18:23:35
【问题描述】:

如果行 = nan0,我想从表中删除所有值。

我知道有一种方法可以使用 pandas 来做到这一点,即 pandas.dropna(how = 'all'),但我想要一个 numpy 方法来删​​除所有 nan0 的行。

有没有有效的实现方式?

【问题讨论】:

  • 第一个似乎是最好的选择。

标签: python numpy pandas


【解决方案1】:

这将删除所有全为零或全为 nan 的行:

mask = np.all(np.isnan(arr), axis=1) | np.all(arr == 0, axis=1)
arr = arr[~mask]

这将删除所有零或 nan 的所有行:

mask = np.all(np.isnan(arr) | arr == 0, axis=1)
arr = arr[~mask]

【讨论】:

    【解决方案2】:
    import numpy as np
    
    a = np.array([
        [1, 0, 0],
        [0, np.nan, 0],
        [0, 0, 0],
        [np.nan, np.nan, np.nan],
        [2, 3, 4]
    ])
    
    mask = np.all(np.isnan(a) | np.equal(a, 0), axis=1)
    a[~mask]
    

    【讨论】:

    • 因为我不熟悉 numpy 我认为a[~foo] 是一个就地删除操作符。 Jaime 的帖子清楚地表明,这会创建一个您需要重新分配的新数组。
    【解决方案3】:

    我喜欢这种方法

    import numpy as np
    
    arr = np.array([[ np.nan,  np.nan],
                    [ -1.,  np.nan],
                    [ np.nan,  -2.],
                    [ np.nan,  np.nan],
                    [ np.nan,   0.]])
    mask = (np.nan_to_num(arr) != 0).any(axis=1)
    

    输出:

    >>> arr[mask]
    ... array([[ -1.,  nan],
              [ nan,  -2.]])
    

    【讨论】:

      【解决方案4】:

      另外:如果行在任何单个值中有 nan 或 0 时要删除行

      a = np.array([
          [1, 0, 0],
          [1, 2, np.nan],
          [np.nan, np.nan, np.nan],
          [2, 3, 4]
      ])
      
      mask = np.any(np.isnan(a) | np.equal(a, 0), axis=1)
      a[~mask]
      

      输出

      array([[ 2.,  3.,  4.]])
      

      【讨论】:

        【解决方案5】:

        列表推导式可以用作单行。

        >> a = array([65.36512 , 39.98848 , 28.25152 , 37.39968 , 59.32288 , 40.85184 ,
               71.98208 , 41.7152  , 33.71776 , 38.5504  , 21.34656 , 37.97504 ,
               57.5968  , 30.494656, 80.03776 , 33.94688 , 37.45792 , 27.617664,
               15.59296 , 27.329984, 45.2256  , 61.27872 , 57.8848  , 87.4592  ,
               34.29312 , 85.15776 , 46.37696 , 79.11616 ,       nan,       nan])
        
        >> np.array([i for i in a if np.isnan(i)==False])
        
        array([65.36512 , 39.98848 , 28.25152 , 37.39968 , 59.32288 , 40.85184 ,
               71.98208 , 41.7152  , 33.71776 , 38.5504  , 21.34656 , 37.97504 ,
               57.5968  , 30.494656, 80.03776 , 33.94688 , 37.45792 , 27.617664,
               15.59296 , 27.329984, 45.2256  , 61.27872 , 57.8848  , 87.4592  ,
               34.29312 , 85.15776 , 46.37696 , 79.11616 ])
        

        【讨论】:

          猜你喜欢
          • 2017-05-11
          • 1970-01-01
          • 2011-08-23
          • 1970-01-01
          • 2014-02-17
          • 2014-09-28
          • 2018-10-29
          • 1970-01-01
          • 2021-08-26
          相关资源
          最近更新 更多