一个系列的真值不明确。 使用a.empty,a.bool(),a.item(),a.any
有问题过滤我的结果数据框or
条件。 我想要我的结果df
提取大于0.25且小于-0.25的所有列_var_
值。 下面的逻辑给我一个模棱两可的真值,但是当我在两个单独的操作中分割这个过滤时,它是有效的。 这里发生了什么? 不知道在哪里使用建议的a.empty(), a.bool(), a.item(),a.any() or a.all()
。
result = result[(result['var']>0.25) or (result['var']<-0.25)]
的or
与and
Python的语句需要truth
-值。 对于pandas
这些被认为是不明确的,所以你应该使用“按位” |
(或)或&
(和)操作:
result = result[(result['var']>0.25) | (result['var']<-0.25)]
对于这些类型的数据结构,这些过载会产生元素明智的or
(或) and
。
只需在本声明中添加更多解释:
当你想要得到的异常被抛出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
):
>>> 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个语句之外,还有几个隐藏一些bool
调用的Python函数(比如any
, all
, filter
,...),这些pandas.Series
通常对于pandas.Series
并不存在问题,但为了完整性,我想提及这些。
在你的情况下,这个例外不是很有用,因为它没有提到正确的选择 。 对于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
时候遇到它,Exception中提到的替代方法更加适合。 我会很快解释其中的每一个:
如果你想检查你的系列是否是空的 :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
通常的Python解释len
容器的GTH(如list
, tuple
,...)作为真值,如果它没有明显的布尔解释。 所以如果你想要python-like检查,你可以这样做: if x.size
或者if not x.empty
而不是if x
。
如果你的Series
包含一个且只有一个布尔值:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
如果你想检查你的系列的第一个和唯一的项目 (比如.bool()
但即使不是布尔内容也可以):
>>> x = pd.Series([100])
>>> 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
对于布尔逻辑,使用&
和|
。
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
>>> df
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
2 0.950088 -0.151357 -0.103219
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
>>> df.loc[(df.C > 0.25) | (df.C < -0.25)]
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
为了看看发生了什么,每次比较都会得到一列布尔值,例如
df.C > 0.25
0 True
1 False
2 False
3 True
4 True
Name: C, dtype: bool
当你有多个标准时,你会得到多个列返回。 这就是连接逻辑不明确的原因。 使用and
或or
对待每列分别,所以你首先需要该列减少到一个布尔值。 例如,查看每列中的任何值或所有值是否为True。
# Any value in either column is True?
(df.C > 0.25).any() or (df.C < -0.25).any()
True
# All values in either column is True?
(df.C > 0.25).all() or (df.C < -0.25).all()
False
实现同样目标的一种复杂方式是将所有这些列压缩在一起,并执行适当的逻辑。
>>> df[[any([a, b]) for a, b in zip(df.C > 0.25, df.C < -0.25)]]
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
有关更多详细信息,请参阅文档中的布尔索引。
或者,也可以使用Operator模块。 更详细的信息在这里Python文档
import operator
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df.loc[operator.or_(df.C > 0.25, df.C < -0.25)]
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.4438
链接地址: http://www.djcxy.com/p/26773.html
上一篇: Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
下一篇: What do * and ** before a variable name mean in a function signature?