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)转换数据,然后执行操作.

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...