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

afu*_*lop 12 python numpy pandas

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

我已经尝试了三种方法,并意识到,表达" np.nanFalse"可evaluted到True,False以及np.nan取决于方法.

这些是我的例子系列:

series_1 = pd.Series([True, False, np.nan])
series_2 = pd.Series([False, False, False])
Run Code Online (Sandbox Code Playgroud)

方法#1

使用|熊猫的运营商:

In [5]: series_1 | series_2
Out[5]: 
0     True
1    False
2    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

方法#2

使用logical_ornumpy中的函数:

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

方法#3

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

@np.vectorize
def vectorized_or(a, b):
   return np.logical_or(a, b)
Run Code Online (Sandbox Code Playgroud)

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

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

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

B. *_* M. 5

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

第二个区别:自从series_1.dtype ifobject(非同质数据),在前两种情况下操作是逐行完成的。

使用矢量化时(#3):

的输出的数据类型vectorized是通过使用输入的第一个元素调用该函数来确定的。通过指定参数可以避免这种情况otypes

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