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

我想对两个熊猫系列的布尔值做一个元素或操作。 np.nan s也包括在内。

我尝试了三种方法,并意识到可以根据方法将表达式“ np.nanFalsenp.nanTrueFalsenp.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数组)转换为熊猫系列:

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

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


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

第二个区别:自serie_1.dtype如果object (非同类数据),操作在两个第一种情况下逐行进行。

当使用矢量化(#3)时:

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

对于矢量化操作,您退出对象模式。 数据首先根据第一个元素(bool在这里, bool(nan)True )转换,并且操作在之后完成。

链接地址: http://www.djcxy.com/p/33949.html

上一篇: Comparing logical values to NaN in pandas/numpy

下一篇: Troubleshooting Styled Media Receiver css