Python 比较pandas/numpy中的逻辑值与NaN

Python 比较pandas/numpy中的逻辑值与NaN,python,numpy,pandas,Python,Numpy,Pandas,我想对两个系列的布尔值进行元素或运算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 Tr

我想对两个系列的布尔值进行元素或运算<代码>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的
逻辑\u或
功能:

In [6]: np.logical_or(series_1, series_2)
Out[6]: 
0     True
1    False
2      NaN
dtype: object
方法#3 我定义了
logical\u或
的矢量化版本,该版本应在数组上逐行计算:

@np.vectorize
def vectorized_or(a, b):
   return np.logical_or(a, b)
我在两个系列上使用
矢量化_或
,并将其输出(是一个numpy数组)转换为一个系列:

In [8]:  pd.Series(vectorized_or(series_1, series_2))
Out[8]: 
0     True
1    False
2     True
dtype: bool
问题: 我想知道这些结果的原因。

解释
np.logical\u或
,并说
np.logical\u或(np.nan,False)
True
,但为什么这只在矢量化时有效,而不是在方法2中?如何解释方法1的结果

第一个区别:
|
np.bitwise\u或
。它解释了#1和#2之间的区别

第二个区别:由于serie_1.dtype if
object
(非齐次数据),在前两种情况下,操作是逐行进行的

使用矢量化(#3)时:

通过调用 具有输入的第一个元素的函数。这是可以避免的 通过指定
otypes
参数


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

在文档中,解释了这些函数的默认行为设置为跳过数据中的NAN。我现在理解了矢量化的效果。但是你说在第二种情况下,操作是逐行进行的。我看到的是最后一个操作是
np.logical\u或(np.nan,False)
,这是
True
,那么为什么第二个结果的最后一个元素是
nan
?你关于
np.bitwise\u或
的另一个评论很有帮助,虽然将
np.bitwise_或
直接用于这两个系列会产生类型错误,因此它们并不完全相同。