这本质上是对我在这里回答内容的重述。
在尝试解决此问题时,我遇到了一些奇怪的行为,使用pd.notnull
.
考虑
x = ('A4', nan)
我想检查这些项目中哪些是空的。直接使用np.isnan
会抛出 TypeError(但我已经想出了如何解决这个问题(。
使用pd.notnull
不起作用。
>>> pd.notnull(x)
True
它将元组视为单个值(而不是值的可迭代对象(。此外,将其转换为列表然后进行测试也会给出不正确的答案。
>>> pd.notnull(list(x))
array([ True, True])
由于第二个值是nan
,我正在寻找的结果应该是[True, False]
。当您预转换为系列时,它最终会起作用:
>>> pd.Series(x).notnull()
0 True
1 False
dtype: bool
因此,解决方案是将其串联化,然后测试值。
同样,另一个(诚然是迂回的(解决方案是预转换为object
dtype numpy 数组,pd.notnull
或np.isnan
将直接工作:
>>> pd.notnull(np.array(x, dtype=object))
Out[151]: array([True, False])
我想pd.notnull
直接将x
转换为幕后的字符串数组,将 NaN 渲染为字符串"nan",因此它不再是"null"值。
pd.notnull
在这里做同样的事情吗?还是在幕后还有其他我应该注意的事情?
笔记
In [156]: pd.__version__
Out[156]: '0.22.0'
下面是与此行为相关的问题:https://github.com/pandas-dev/pandas/issues/20675。
简而言之,如果传递给notnull
的参数是list
类型,则在内部使用np.asarray
方法将其转换为np.array
。出现此错误是因为,如果未指定dtype
,numpy 会将np.nan
转换为string
(pd.isnull
无法将其识别为 null 值(:
a = ['A4', np.nan]
np.asarray(a)
# array(['A4', 'nan'], dtype='<U3')
此问题已在版本 0.23.0 中修复,方法是使用dtype=object
调用np.asarray
。