我想对两个Pandas做一个元素级的OR运算。也包括了np.nan
。
我尝试了三种方法,并意识到表达式“np.nan
or False
“可以根据方法的不同计算为True
、False
和np.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的结果?
1条答案
按热度按时间bgtovc5b1#
第一个区别:
|
是np.bitwise_or
,它解释了#1和#2之间的差异。第二个差异:由于series_1.dtype if
object
(非同类数据),在前两种情况下,操作是逐行进行的。使用矢量化(#3)时:
vectorized
输出的数据类型是通过调用具有输入的第一个元素的函数来确定的。这可以通过指定otypes
参数来避免。对于矢量化操作,您退出对象模式。数据首先根据第一个元素进行转换(这里是bool,
bool(nan)
是True
),然后再进行操作。