一个系列的真值不明确。 使用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)]

orand 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它也适用于andifwhile ):

>>> 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函数(比如anyallfilter ,...),这些pandas.Series通常对于pandas.Series并不存在问题,但为了完整性,我想提及这些。


在你的情况下,这个例外不是很有用,因为它没有提到正确的选择 。 对于andor你可以使用(如果你想元素比较):

  • 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工作。


    如果您在做ifwhile时候遇到它,Exception中提到的替代方法更加适合。 我会很快解释其中的每一个:

  • 如果你想检查你的系列是否是空的

    >>> x = pd.Series([])
    >>> x.empty
    True
    >>> x = pd.Series([1])
    >>> x.empty
    False
    

    通常的Python解释len容器的GTH(如listtuple ,...)作为真值,如果它没有明显的布尔解释。 所以如果你想要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
    

    当你有多个标准时,你会得到多个列返回。 这就是连接逻辑不明确的原因。 使用andor对待每列分别,所以你首先需要该列减少到一个布尔值。 例如,查看每列中的任何值或所有值是否为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?