pandas 在panda/numpy中比较逻辑值与NaN

utugiqy6  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(115)

我想对两个Pandas做一个元素级的OR运算。也包括了np.nan
我尝试了三种方法,并意识到表达式“np.nan or False“可以根据方法的不同计算为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数组)转换为panda系列:

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)是be True,但为什么这只在矢量化时有效,而在方法#2中无效?如何解释方法#1的结果?

bgtovc5b

bgtovc5b1#

第一个区别:|np.bitwise_or,它解释了#1和#2之间的差异。
第二个差异:由于series_1.dtype if object(非同类数据),在前两种情况下,操作是逐行进行的。
使用矢量化(#3)时:
vectorized输出的数据类型是通过调用具有输入的第一个元素的函数来确定的。这可以通过指定otypes参数来避免。
对于矢量化操作,您退出对象模式。数据首先根据第一个元素进行转换(这里是bool,bool(nan)True),然后再进行操作。

相关问题