使用条件过滤我的结果数据框时出现or问题。我希望我的结果df能够提取所有var高于 0.25 且低于 -0.25 的列值。
or
df
var
下面的这个逻辑给了我一个模棱两可的真值但是当我把这个过滤分成两个单独的操作时它会起作用。这里发生了什么?不知道在哪里使用建议的a.empty(), a.bool(), a.item(),a.any() or a.all().
a.empty(), a.bool(), a.item(),a.any() or a.all()
result = result[(result['var'] > 0.25) or (result['var'] < -0.25)]
和python 语句需要or-values 。因为这些被认为是模棱两可的,所以你应该使用“按位” (或)或(和)操作:and``truth``pandas``|``&
and``truth``pandas``|``&
result = result[(result['var']>0.25) | (result['var']<-0.25)]
对于这些类型的数据结构,这些被重载以产生元素方式or(或and)。
and
只是为了对此声明添加更多解释:
当您想要获取boola时会引发异常pandas.Series:
bool
pandas.Series
>>> import pandas as pd >>> x = pd.Series([1]) >>> bool(x) ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
您遇到的是运算符 隐式 将操作数转换为的位置bool(您使用过or,但它也发生在and,if和while):
if
while
>>> x or x ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> x and x ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> if x: ... print('fun') ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> while x: ... print('fun') ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
除了这 4 条语句之外,还有几个 python 函数可以隐藏一些bool调用(如any, all, filter, …),这些通常没有问题,pandas.Series但为了完整起见,我想提一下这些。
any
all
filter
在您的情况下,异常并没有真正的帮助,因为它没有提到 正确的替代品 。对于and并且or您可以使用(如果您想要逐元素比较):
numpy.logical_or
>>> import numpy as np
np.logical_or(x, y)
或者只是|操作员:
|
>>> x | y
numpy.logical_and
>>> np.logical_and(x, y)
或者只是&操作员:
&
>>> x & y
如果您使用运算符,请确保正确设置括号,因为运算符优先级。
有几个逻辑 numpy 函数 应该在pandas.Series.
if如果您在执行或时遇到了异常中提到的替代方案,则更适合while。我将简要解释其中的每一个:
>>> x = pd.Series([])
x.empty True x = pd.Series([1]) x.empty False
如果没有明确的布尔解释,Python 通常将length 的容器(如list, , …)解释为真值。tuple因此,如果您想要类似 python 的检查,您可以这样做:if x.size或if not x.empty代替if x.
len
list
tuple
if x.size
if not x.empty
if x
如果您Series包含 一个且只有一个 布尔值:
Series
>>> x = pd.Series([100])
(x > 50).bool() True (x < 50).bool() False
如果您想检查您的系列的 第一个也是唯一一个项目 (例如.bool()但即使对于非布尔内容也有效):
.bool()
x.item() 100
如果您想检查 所有 或 任何 项目是否非零、非空或非假:
>>> x = pd.Series([0, 1, 2])
x.all() # because one element is zero False x.any() # because one (or more) elements are non-zero True