如何检查列表中是否存在np.NaN和/或None

时间:2019-01-25 16:38:20

标签: python numpy

None被视为错误条件。但是np.NaN在转换为True时被视为bool

any([np.nan, np.NaN, None])
#True

我了解,可以使用np.isnan()来捕获它。如果我的数据包含np.NaNNonenp.nan的组合,那么如果存在这些元素中的任何一个,我如何找到它。

有没有更简单的方法来找到它们之一?

编辑:

预期输出:

func([np.nan, np.NaN, None, 2])
#True
func([np.nan, np.NaN, None,''])
#False

4 个答案:

答案 0 :(得分:3)

您可以定义自己的自定义函数,以检查数字是否在有效输入集中,例如:

def isvalid(number):
    if number is None or np.isnan(number):
        return False
    else:
        return True

any([isvalid(x) for x in data])

编辑:我知道您可能要检查其中是否有一个无效的,您可以简单地将isvalid结果取反来实现。

答案 1 :(得分:2)

另一种方法是将任何nan转换为有效数字,在这种情况下为0.0

In[91]:
any([np.nan_to_num(x) for x in [np.nan, np.NaN, None]])

Out[91]: False

np.nan_to_num会将NaN转换为0.0

In[92]:

[np.nan_to_num(x) for x in [np.nan, np.NaN, None]]
Out[92]: [0.0, 0.0, None]

编辑

这还将处理您更新的样本数据:

In[93]:

any([np.nan_to_num(x) for x in [np.nan, np.NaN, None,'']])
Out[93]: False

答案 2 :(得分:1)

这是另一个技巧:

arr = [np.nan, None, np.nan]

[i == i if i is not None else False  for i in arr]

输出:

[False, False, False]
  

注意:np.nan == np.nan返回False

因此

arr = [np.nan, None, np.nan, '']
any([i == i if i is not None and i != '' else False  for i in arr])

输出:

False

然后

arr = [np.nan, None, np.nan, 2]

any([i == i if i is not None and i != '' else False  for i in arr])

输出:

True

时间:

%timeit any([np.nan_to_num(x) for x in arr])
  

每个循环241 µs±22 µs(平均±标准偏差,共运行7次,每个循环1000次)

%timeit any([isvalid(x) for x in arr])
  

每个循环20.5 µs±1.95 µs(平均±标准偏差,共运行7次,每个循环100000次)

%timeit any([i == i if i is not None and i != '' else False  for i in arr])
  

每个循环2.44 µs±137 ns(平均±标准偏差,共运行7次,每个循环100000次)

答案 3 :(得分:1)

以下方法将 None、各种 NaN 甚至 nan 视为字符串:

>>> import numpy as np
>>> any([~np.isnan(np.float_(x)) for x in [np.nan, np.NaN, None, 'NaN', 'nan']])
False

Pandas 有一个 notna 函数,适用于 None 和各种 NaN(但不能将 NaN 作为字符串)。

>>> import pandas as pd
>>> any([pd.notna(x) for x in [np.nan, np.NaN, None, pd.NA, pd.NaT]])
False

这些方法都不适用于空字符串 ''