Pandas - 如果数据框中所有值都是NaN

5
如何创建一个if语句,实现以下功能:
 if all values in dataframe are nan:
     do something 
 else: 
     do something else

根据这篇文章,可以检查DataFrame的所有值是否为NaN。我知道不能这样做:
if df.isnull().all():
    do something

它返回以下错误:

ValueError: 系列的真值是模棱两可的。请使用a.empty, a.bool(), a.item(), a.any()或a.all()。

2个回答

11

需要另一个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,但首先通过values将所有值转换为numpy array
print (np.isnan(df.values).all())
True

时间:

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

np.isnan(df.values).all() 的结果是:AttributeError:'numpy.ndarray'对象没有'isnan'属性。 - Nairum

5
更快的改进是使用jezrael的代码:df.isnull().values.all()
In [156]: df.isnull().values.all()
Out[156]: True

基准测试

小型

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接