for x in X_cat:
if x == np.nan:
print('Found')
我知道这个列表中有两个NaN条目,但是代码运行时没有打印任何内容。如果我用'nan'代替np.nan也是一样的。我的最终目标是用最常见的字符串替换NaN。
nan_str = str_np.array([np.nan]).astype(str)[0]
只需在方括号内输入要存储的元素,元素之间用逗号分隔即可:
x = np.array(['hello', np.nan, 'world', np.nan], dtype=object)
然后您可以用我假定为mostcommonstring
的最常见字符串来替换这些nan
:
x[np.where(x.astype(str)==str_nan)]='mostcommonstring'
这是因为将任何与NaN
进行比较,包括NaN
本身,都会返回False
。因此,即使x
是np.nan
,print
也不会运行。(实际上,这曾经是一种检查是否为NaN
的可接受方法,因为没有其他IEEE754浮点值具有该属性。)
使用np.isnan(x)
来检查x
是否为NaN
。
由于声望不够,无法对Thibaut的回答进行评论,但简单来说:
nan-string
可以是np.str_(np.nan)
甚至是str(np.nan)
。
x = np.array(['hello', np.nan, 'world', np.nan], dtype=object)
x[np.where(x.astype(str)==str(np.nan))] = 'mostcommonstring'
for x in X_cat:
if np.isnan(x):
print('Found')
np.nan == np.nan
返回 False
,因此直接比较在这里是没有意义的。了解更多关于isnan的信息,请参见numpy文档
NaN
有时被程序员用作方便的“填充物”,可以像数字一样静默传播。但在数学上,NaN
表示诸如 0/0
的表达式,其实质上可以是任何数字(如果 a = 0/0
,a*0=0
,因此a
可以是任何值)。
除了极小概率外,“任何可能的数字”==
“任何可能的数字”是False
。
当你涉及到 nan
和 inf
值时,相等性是一个奇怪的概念(尝试理解 1+2+3+4+5+...=-1/12
)。只需使用提供的函数,如np.isnan
即可。
你无法在字符串数组中找到np.nan
,因为np.nan
是一个数字,而不是一个字符串,numpy数组中的所有元素必须具有相同的类型。
np.nan == np.nan
返回False
。 - Daniel F