Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
在使用
下面的逻辑给了我一个模糊的真值,但是当我将这个过滤拆分为两个单独的操作时,它会起作用。这里发生了什么?不知道在哪里使用建议的
1 | result = result[(result['var']>0.25) or (result['var']<-0.25)] |
在
1 | result = result[(result['var']>0.25) | (result['var']<-0.25)] |
这些都是负载的方法,这些种高产的元数据库结构的平衡
只是添加一些更多的解释到这个声明: </P >
在thrown例外是当你想得到的
1 2 3 4 | >>> 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(). |
什么是你的生命是一个地方在运营商的implicitly转换的operands到
1 2 3 4 5 6 7 8 9 10 | >>> 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(). |
这些besides 4 statements有几种是Python函数是隐藏的一些
在你的案例中的例外是真的helpful T,T,因为它不值得一提,右键的方案。方法
-
numpy.logical_or : </P >1
2>>> import numpy as np
>>> np.logical_or(x, y)或是
| 算子: </P >1>>> x | y -
numpy.logical_and : </P >1>>> np.logical_and(x, y)或是
& 算子: </P >1>>> x & y
如果你是使用运营商,那么让我相信你,因为你的parenthesis集correctly的算子值优先。 </P >
有几个是逻辑函数的numpy这工作应该是
在这些方案中的例外是suited更多,如果你encountered当它做
-
如果你想检查如果你的系列是空的: </P >
1
2
3
4
5
6>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
FalsePython normally interprets的
len gth大学(list 状容器,tuple ,…………………)作为真理的值,如果它有好的布尔函数的显式的解释。所以如果你想在Python的类的检查,你能做的:if x.size 或if not x.empty 去大学的if x 。。。。。。。 </P > -
如果你的
Series 包含唯一的一个布尔值: </P >1
2
3
4
5>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False -
如果你想检查的第一个和你的只读项系列(状
.bool() 厂,但夏娃的方法不是布尔contents): </P >1
2
3>>> x = pd.Series([100])
>>> x.item()
100 -
如果你想检查是否所有或任何item是非零的,不是空的或不假: </P >
1
2
3
4
5>>> 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
布尔逻辑的方法,使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
看到什么是发生,你得到一个column for each of布尔值的比较,如 </P >
1 2 3 4 5 6 7 | df.C > 0.25 0 True 1 False 2 False 3 True 4 True Name: C, dtype: bool |
当你有多个标准,你将得到的多柱式的returned。。。。。。。这就是为什么在我的逻辑是ambiguous。。。。。。。利用
1 2 3 4 5 6 7 | # 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 |
一个convoluted方式来达到同样的事是拉链,所有的这些列在一起,在适当的情况下和颈静脉孔区的逻辑。 </P >
1 2 3 4 5 6 | >>> 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 |
用更多的细节,参考到布尔密封中的文档。 </P >
或者,alternatively,你可以使用运营商的模块。更多的详细信息,这里是Python的文档 </P >
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
这场精彩的答案explains甚好什么是发生和提供解决方案。我很喜欢到添加另一个解决方案,这可能是针对适合在类似的案例:使用方法:
1 | result = result.query("(var > 0.25) or (var < -0.25)") |
也看到http:/ / / pandas.pydata.org pandas文档/稳定/ indexing.html #密封查询。 </P >
(一些试验与一帧I’m目前工作与suggest说,这个方法是一个位的slower比使用按位操作是一系列的布尔运算:2 ms vs. 870μS) </P >
一件协会警告:至少在一个情况,这是不straightforward column names是当发生的概率是Python表达式。我有
我得到下面的级联的例外: </P >
-
KeyError: 'log2' -
UndefinedVariableError: name 'log2' is not defined -
ValueError:"log2" is not a supported function
我猜这发生,因为查询分析器是试图做出让某个东西从第一双柱式的去大学的识别中的表达与名牌大学的第三柱。 </P >
一种可能的workaround是这里提出的。 </P >