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

时间:2016-05-10 07:03:57

标签: python numpy pandas

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

我尝试了三种方法,并意识到表达式“np.nanFalse”可以评估为TrueFalsenp.nan,具体取决于方法。

这些是我的例子系列:

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

方法#1

使用pandas的|运算符:

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的结果?

1 个答案:

答案 0 :(得分:3)

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

第二个区别:因为serie_1.dtype if object(非同质数据),所以在前两种情况下逐行完成操作。

使用矢量化时(#3):

  

vectorized输出的数据类型由调用确定   具有输入的第一个元素的函数。这可以避免   通过指定otypes参数。

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