首页 文章

Pandas - 如果dataFrame的所有值都是NaN

提问于
浏览
2

如何创建执行以下操作的if语句:

if all values in dataframe are nan:
     do something 
 else: 
     do something else

根据this post,可以检查DataFrame的所有值是否都是NaN . 我知道一个人做不到:

if df.isnull().all():
    do something

它返回以下错误:

ValueError:系列的真值是不明确的 . 使用a.empty,a.bool(),a.item(),a.any()或a.all() .

2 回答

  • 1

    需要另一个 all ,因为首先 all 返回 Series 和另一个 scalar

    if df.isnull().all().all():
        do something
    

    样品:

    df = pd.DataFrame(index=range(5), columns=list('abcde'))
    print (df)
         a    b    c    d    e
    0  NaN  NaN  NaN  NaN  NaN
    1  NaN  NaN  NaN  NaN  NaN
    2  NaN  NaN  NaN  NaN  NaN
    3  NaN  NaN  NaN  NaN  NaN
    4  NaN  NaN  NaN  NaN  NaN
    
    print (df.isnull())
          a     b     c     d     e
    0  True  True  True  True  True
    1  True  True  True  True  True
    2  True  True  True  True  True
    3  True  True  True  True  True
    4  True  True  True  True  True
    
    print (df.isnull().all())
    a    True
    b    True
    c    True
    d    True
    e    True
    dtype: bool
    
    print (df.isnull().all().all())
    True
    
    if df.isnull().all().all():
        print ('do something')
    

    如果需要更快的解决方案numpy.isnannumpy.all,但首先将所有值转换为 numpy array values

    print (np.isnan(df.values).all())
    True
    

    Timings

    df = pd.DataFrame(np.full((1000,1000), np.nan))
    print (df)
    
    In [232]: %timeit (np.isnan(df.values).all())
    1000 loops, best of 3: 1.23 ms per loop
    
    In [233]: %timeit (df.isnull().all().all())
    100 loops, best of 3: 10 ms per loop
    
    In [234]: %timeit (df.isnull().values.all())
    1000 loops, best of 3: 1.46 ms per loop
    
  • 8

    对jezrael的快速改进将是 df.isnull().values.all()

    In [156]: df.isnull().values.all()
    Out[156]: True
    

    Benchmarks

    In [149]: df.shape
    Out[149]: (5, 5)
    
    In [150]: %timeit df.isnull().values.all()
    10000 loops, best of 3: 112 µs per loop
    
    In [151]: %timeit df.isnull().all().all()
    1000 loops, best of 3: 271 µs per loop
    

    In [153]: df.shape
    Out[153]: (1000, 1000)
    
    In [154]: %timeit df.isnull().values.all()
    10 loops, best of 3: 26.6 ms per loop
    
    In [155]: %timeit df.isnull().all().all()
    10 loops, best of 3: 40.8 ms per loop
    

相关问题