当将NumPy Not-a-Number值转换为布尔值时,它变为True,例如如下.
>>> import numpy as np
>>> bool(np.nan)
True
Run Code Online (Sandbox Code Playgroud)
这与我直觉所期望的完全相反.这种行为是否存在合理的原则?
(我怀疑在Octave中可能会出现相同的行为.)
我想对两个pandas系列的布尔值进行逐元素的OR运算.np.nans也包括在内.
我已经尝试了三种方法,并意识到,表达" np.nan或False"可evaluted到True,False以及np.nan取决于方法.
这些是我的例子系列:
series_1 = pd.Series([True, False, np.nan])
series_2 = pd.Series([False, False, False])
Run Code Online (Sandbox Code Playgroud)
使用|熊猫的运营商:
In [5]: series_1 | series_2
Out[5]:
0 True
1 False
2 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
使用logical_ornumpy中的函数:
In [6]: np.logical_or(series_1, series_2)
Out[6]:
0 True
1 False
2 NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)
我定义了一个矢量化版本,logical_or它应该在数组上逐行进行评估:
@np.vectorize
def vectorized_or(a, b):
return np.logical_or(a, b)
Run Code Online (Sandbox Code Playgroud)
我vectorized_or在两个系列上使用并将其输出(这是一个numpy数组)转换为pandas系列:
In [8]: pd.Series(vectorized_or(series_1, series_2))
Out[8]:
0 …Run Code Online (Sandbox Code Playgroud) 给定一个数据框,我认为以下是正确的:
df[(condition_1) | (condition_2)] <=> df[(condition_2) | (condition_1)]
Run Code Online (Sandbox Code Playgroud)
如
df[(df.col1==1) | (df.col1==2)] <=> df[(df.col1==2) | (df.col1==1)]
Run Code Online (Sandbox Code Playgroud)
但事实证明它在以下情况下失败,其中涉及NaN这可能是失败的原因:
df = pd.DataFrame([[np.nan, "abc", 2], ["abc", 2, 3], [np.nan, 5,6], [8,9,10]], columns=["A", "B", "C"])
df
A B C
0 NaN abc 2
1 abc 2 3
2 NaN 5 6
3 8 9 10
Run Code Online (Sandbox Code Playgroud)
以下按预期工作:
df[(df.A.isnull()) | (df.A.str.startswith("a"))]
A B C
0 NaN abc 2
1 abc 2 3
2 NaN 5 6
Run Code Online (Sandbox Code Playgroud)
但是,如果我对元素进行通勤,则会得到不同的结果:
df[(df.A.str.startswith("a")) | (df.A.isnull())]
A B …Run Code Online (Sandbox Code Playgroud)