奇怪的空检查行为由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版中解决了此问题.

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...