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

python – 在pandas / numpy中将逻辑值与NaN进行比较

我想对两个pandas系列的布尔值进行逐元素的OR运算. np.nans也包括在内.

我尝试了三种方法,并意识到表达式“np.nan或False”可以根据方法计算为True,False和np.nan.

这些是我的例子系列:

series_1 = pd.Series([True, False, np.nan])
series_2 = pd.Series([False, False, False])

方法#1

使用|大熊猫的经营者:

In [5]: series_1 | series_2
Out[5]: 
0     True
1    False
2    False
dtype: bool

方法#2

使用numpy中的logical_or函数

In [6]: np.logical_or(series_1, series_2)
Out[6]: 
0     True
1    False
2      NaN
dtype: object

方法#3

我定义了一个矢量化版本的logical_or,它应该在数组上逐行进行评估:

@np.vectorize
def vectorized_or(a, b):
   return np.logical_or(a, b)

我在两个系列上使用vectorized_or并将其输出(这是一个numpy数组)转换为pandas系列:

In [8]:  pd.Series(vectorized_or(series_1, series_2))
Out[8]: 
0     True
1    False
2     True
dtype: bool

我想知道这些结果的原因.
This answer解释了np.logical_or,并说np.logical_or(np.nan,False)是True,但为什么这只适用于矢量化而不是方法#2?如何解释方法#1的结果?

解决方法:

一个区别:|是np.bitwise_or.它解释了#1和#2之间的区别.

第二个区别:因为serie_1.dtype如果是对象(非同类数据),则在两个第一种情况下逐行完成操作.

使用矢量化时(#3):

The data type of the output of vectorized is determined by calling
the function with the first element of the input. This can be avoided
by specifying the otypes argument.

对于矢量化操作,您退出对象模式.首先根据第一个元素(bool,bool(nan)为True)转换数据,然后执行操作.

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

相关推荐