pd.notnull奇怪的null检查行为

时间:2018-06-26 05:59:17

标签: python pandas null

这本质上是对我的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.notnullnp.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'

1 个答案:

答案 0 :(得分:3)

以下是与此行为有关的问题:https://github.com/pandas-dev/pandas/issues/20675

简而言之,如果传递给notnull的参数的类型为list,则在内部使用np.array方法将其转换为np.asarray。发生此错误的原因是,如果未指定dtype,numpy会将np.nan转换为stringpd.isnull无法识别为空值):

a = ['A4', np.nan]
np.asarray(a)
# array(['A4', 'nan'], dtype='<U3')

此问题已在0.23.0版中通过使用np.asarray调用dtype=object来解决。