关于python:系列的真值是模棱两可的。

Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

在使用or条件筛选结果数据帧时出现问题。我希望我的结果df提取所有列var值,这些值高于0.25,低于-0.25。

下面的逻辑给了我一个模糊的真值,但是当我将这个过滤拆分为两个单独的操作时,它会起作用。这里发生了什么?不知道在哪里使用建议的a.empty(), a.bool(), a.item(),a.any() or a.all()

1
 result = result[(result['var']>0.25) or (result['var']<-0.25)]


orandPython statements require once truth值。这些都是被视为pandasambiguous所以你应该使用"位"|(或&)或(和)操作: </P >

1
result = result[(result['var']>0.25) | (result['var']<-0.25)]

这些都是负载的方法,这些种高产的元数据库结构的平衡or(或and)。 </P >

只是添加一些更多的解释到这个声明: </P >

在thrown例外是当你想得到的boolpandas.Series: </P >

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到bool(你用or但它也发生and方法,ifwhile): </P >

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函数是隐藏的一些bool电话(any状,allfilter,…………………),这些都是不normally problematic与pandas.Series但设计完备的我想提到这些。 </P >

在你的案例中的例外是真的helpful T,T,因为它不值得一提,右键的方案。方法andor你可以使用(如果你想元明智的方法): </P >

  • 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这工作应该是pandas.Series。。。。。。。 </P >

在这些方案中的例外是suited更多,如果你encountered当它做ifwhile。。。。。。。我会shortly explain each of这些: </P >

  • 如果你想检查如果你的系列是空的: </P >

    1
    2
    3
    4
    5
    6
    >>> x = pd.Series([])
    >>> x.empty
    True
    >>> x = pd.Series([1])
    >>> x.empty
    False

    Python normally interprets的length大学(list状容器,tuple,…………………)作为真理的值,如果它有好的布尔函数的显式的解释。所以如果你想在Python的类的检查,你能做的:if x.sizeif 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


布尔逻辑的方法,使用&|。。。。。。。 </P >

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。。。。。。。利用andortreats每柱separately第一,所以你需要减少到一个单一的那一列的布尔值。例如,如果看到任何价值或全值在每一系列的是真的。 </P >

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甚好什么是发生和提供解决方案。我很喜欢到添加另一个解决方案,这可能是针对适合在类似的案例:使用方法:query </P >

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表达式。我有WT_38hph_IP_2列名,WT_38hph_input_2log2(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 >