pandas 判断是否等于nan,在pandas / numpy中将逻辑值与NaN进行比较

I want to do an element-wise OR operation on two pandas Series of boolean values. np.nans are also included.

I have tried three approaches and realized that the expression "np.nan or False" can be evaluted to True, False, and np.nan depending on the approach.

These are my example Series:

series_1 = pd.Series([True, False, np.nan])

series_2 = pd.Series([False, False, False])

Approach #1

Using the | operator of pandas:

In [5]: series_1 | series_2

Out[5]:

0 True

1 False

2 False

dtype: bool

Approach #2

Using the logical_or function from numpy:

In [6]: np.logical_or(series_1, series_2)

Out[6]:

0 True

1 False

2 NaN

dtype: object

Approach #3

I define a vectorized version of logical_or which is supposed to be evaluated row-by-row over the arrays:

@np.vectorize

def vectorized_or(a, b):

return np.logical_or(a, b)

I use vectorized_or on the two series and convert its output (which is a numpy array) into a pandas Series:

In [8]: pd.Series(vectorized_or(series_1, series_2))

Out[8]:

0 True

1 False

2 True

dtype: bool

Question

I am wondering about the reasons for these results.

This answer explains np.logical_or and says np.logical_or(np.nan, False) is be True but why does this only works when vectorized and not in Approach #2? And how can the results of Approach #1 be explained?

解决方案

first difference : | is np.bitwise_or. it explains the difference between #1 and #2.

Second difference : since serie_1.dtype if object (non homogeneous data), operations are done row by row in the two first cases.

When using vectorize ( #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.

For vectorized operations, you quit the object mode. data are first converted according to first element (bool here, bool(nan) is True) and the operations are done after.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值