在使用or条件筛选结果数据帧时出现问题。我希望我的结果df提取所有列var值,这些值高于0.25,低于-0.25。
下面的逻辑给了我一个模糊的真值,但是当我将这个过滤拆分为两个单独的操作时,它会起作用。这里发生了什么?不知道在哪里使用建议的a.empty(), a.bool(), a.item(),a.any() or a.all()。
result = result[(result['var']>0.25) or (result['var']
你应该添加更多的上下文。我不明白结果是什么,你想做什么。
用|代替or。
这里有一个解决办法:abs(result['var'])>0.25。
相关:熊猫布尔索引的逻辑运算符
在or和andPython statements require once truth值。这些都是被视为pandasambiguous所以你应该使用"位"|(或&)或(和)操作: </P >
result = result[(result['var']>0.25) | (result['var']
这些都是负载的方法,这些种高产的元数据库结构的平衡or(或and)。 </P >
只是添加一些更多的解释到这个声明: </P >
在thrown例外是当你想得到的bool一pandas.Series: </P >
>>> 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到bool(你用or但它也发生and方法,if和while): </P >
>>> 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函数是隐藏的一些bool电话(any状,all,filter,…………………),这些都是不normally problematic与pandas.Series但设计完备的我想提到这些。 </P >
在你的案例中的例外是真的helpful T,T,因为它不值得一提,右键的方案。方法and和or你可以使用(如果你想元明智的方法): </P >
numpy.logical_or: </P >
>>> import numpy as np
>>> np.logical_or(x, y)
或是|算子: </P >
>>> x | y
numpy.logical_and: </P >
>>> np.logical_and(x, y)
或是&算子: </P >
>>> x & y
如果你是使用运营商,那么让我相信你,因为你的parenthesis集correctly的算子值优先。 </P >
有几个是逻辑函数的numpy这工作应该是pandas.Series。。。。。。。 </P >
在这些方案中的例外是suited更多,如果你encountered当它做if或while。。。。。。。我会shortly explain each of这些: </P >
如果你想检查如果你的系列是空的: </P >
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python normally interprets的length大学(list状容器,tuple,…………………)作为真理的值,如果它有好的布尔函数的显式的解释。所以如果你想在Python的类的检查,你能做的:if x.size或if not x.empty去大学的if x。。。。。。。 </P >
如果你的Series包含唯一的一个布尔值: </P >
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
如果你想检查的第一个和你的只读项系列(状.bool()厂,但夏娃的方法不是布尔contents): </P >
>>> x = pd.Series([100])
>>> x.item()
100
如果你想检查是否所有或任何item是非零的,不是空的或不假: </P >
>>> 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
哦,我的上帝!你的评论"如果你使用的是操作符,那么确保你的括号设置正确,因为操作符的优先级"最终解决了让我发疯的问题。这是一个非常重要的问题,在我看来,也是一个被忽视的问题。谢谢您!
我读了很长时间的最有见地的答案之一
为什么这些python操作符不能重载以处理pandas系列?
@在python中,muditjain无法直接重载and、or和not。这些运算符直接使用操作数返回的bool。在某种程度上,pandas/numpy过载已经导致ValueError上升,因为他们认为这样一个数据结构的真实值不明确。
布尔逻辑的方法,使用&和|。。。。。。。 </P >
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 >
df.C > 0.25
0 True
1 False
2 False
3 True
4 True
Name: C, dtype: bool
当你有多个标准,你将得到的多柱式的returned。。。。。。。这就是为什么在我的逻辑是ambiguous。。。。。。。利用and或ortreats每柱separately第一,所以你需要减少到一个单一的那一列的布尔值。例如,如果看到任何价值或全值在每一系列的是真的。 </P >
# 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 >
>>> 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 >
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甚好什么是发生和提供解决方案。我很喜欢到添加另一个解决方案,这可能是针对适合在类似的案例:使用方法:query </P >
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表达式。我有WT_38hph_IP_2列名,WT_38hph_input_2和log2(WT_38hph_IP_2/WT_38hph_input_2)和想对颈静脉孔区下面的查询:"(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)" </P >
我得到下面的级联的例外: </P >
KeyError: 'log2'
UndefinedVariableError: name 'log2' is not defined
ValueError:"log2" is not a supported function
我猜这发生,因为查询分析器是试图做出让某个东西从第一双柱式的去大学的识别中的表达与名牌大学的第三柱。 </P >
一种可能的workaround是这里提出的。 </P >