我想对两个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 theotypes
argument.
对于矢量化操作,您退出对象模式.首先根据第一个元素(bool,bool(nan)为True)转换数据,然后执行操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。