这本质上是对我的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 举报,一经查实,本站将立刻删除。