这本质上是对我的answer here内容的重新哈希处理。
在尝试使用pd.notnull
解决this question时,我遇到了一些奇怪的行为。
考虑
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'
答案 0 :(得分:3)
以下是与此行为有关的问题:https://github.com/pandas-dev/pandas/issues/20675。
简而言之,如果传递给notnull
的参数的类型为list
,则在内部使用np.array
方法将其转换为np.asarray
。发生此错误的原因是,如果未指定dtype
,numpy会将np.nan
转换为string
(pd.isnull
无法识别为空值):
a = ['A4', np.nan]
np.asarray(a)
# array(['A4', 'nan'], dtype='<U3')
此问题已在0.23.0版中通过使用np.asarray
调用dtype=object
来解决。