Python 比较pandas/numpy中的逻辑值与NaN
我想对两个系列的布尔值进行元素或运算<代码>np.nans也包括在内 我尝试了三种方法,并意识到表达式“Python 比较pandas/numpy中的逻辑值与NaN,python,numpy,pandas,Python,Numpy,Pandas,我想对两个系列的布尔值进行元素或运算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 Tr
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的逻辑\u或功能:
In [6]: np.logical_or(series_1, series_2)
Out[6]:
0 True
1 False
2 NaN
dtype: object
方法#3
我定义了logical\u或的矢量化版本,该版本应在数组上逐行计算:
@np.vectorize
def vectorized_or(a, b):
return np.logical_or(a, b)
我在两个系列上使用矢量化_或,并将其输出(是一个numpy数组)转换为一个系列:
In [8]: pd.Series(vectorized_or(series_1, series_2))
Out[8]:
0 True
1 False
2 True
dtype: bool
问题:
我想知道这些结果的原因。
解释np.logical\u或
,并说np.logical\u或(np.nan,False)
是True
,但为什么这只在矢量化时有效,而不是在方法2中?如何解释方法1的结果 第一个区别:|
是np.bitwise\u或
。它解释了#1和#2之间的区别
第二个区别:由于serie_1.dtype ifobject
(非齐次数据),在前两种情况下,操作是逐行进行的
使用矢量化(#3)时:
通过调用
具有输入的第一个元素的函数。这是可以避免的
通过指定otypes
参数
对于矢量化操作,退出对象模式。首先根据第一个元素转换数据(这里的bool,bool(nan)
是True
),然后执行操作 在文档中,解释了这些函数的默认行为设置为跳过数据中的NAN。我现在理解了矢量化的效果。但是你说在第二种情况下,操作是逐行进行的。我看到的是最后一个操作是np.logical\u或(np.nan,False)
,这是True
,那么为什么第二个结果的最后一个元素是nan
?你关于
是np.bitwise\u或
的另一个评论很有帮助,虽然将np.bitwise_或
直接用于这两个系列会产生类型错误,因此它们并不完全相同。