微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

奇怪的空检查行为由pd.notnull

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

因此,解决方案是对它进行系列化处理,然后测试这些值.

同样,另一种(公认的环形交叉路口)解决方案是将其预转换为对象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转换为字符串(pd.isnull无法将其识别为空值):

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐