我在Pandas中使用布尔索引.问题是为什么声明:
a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]
Run Code Online (Sandbox Code Playgroud)
工作正常,而
a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]
Run Code Online (Sandbox Code Playgroud)
存在错误?
例:
a=pd.DataFrame({'x':[1,1],'y':[10,20]})
In: a[(a['x']==1)&(a['y']==10)]
Out: x y
0 1 10
In: a[(a['x']==1) and (a['y']==10)]
Out: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud) 我想对两个pandas系列的布尔值进行逐元素的OR运算.np.nan
s也包括在内.
我已经尝试了三种方法,并意识到,表达" 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_or
numpy中的函数:
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)