None
被视为错误条件。但是np.NaN
在转换为True
时被视为bool
。
any([np.nan, np.NaN, None])
#True
我了解,可以使用np.isnan()
来捕获它。如果我的数据包含np.NaN
,None
,np.nan
的组合,那么如果存在这些元素中的任何一个,我如何找到它。
有没有更简单的方法来找到它们之一?
编辑:
预期输出:
func([np.nan, np.NaN, None, 2])
#True
func([np.nan, np.NaN, None,''])
#False
答案 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
这些方法都不适用于空字符串 ''
。