小编典典

Series 的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

all

使用条件过滤我的结果数据框时出现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'] < -0.25)]

阅读 217

收藏
2022-03-03

共1个答案

小编典典

和python 语句需要or-values 。因为这些被认为是模棱两可的,所以你应该使用“按位”
(或)或(和)操作:and``truth``pandas``|``&

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

对于这些类型的数据结构,这些被重载以产生元素方式or(或and)。


只是为了对此声明添加更多解释:

当您想要获取boola时会引发异常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,ifwhile):

>>> 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 条语句之外,还有几个 python 函数可以隐藏一些bool调用(如any, all, filter,
…),这些通常没有问题,pandas.Series但为了完整起见,我想提一下这些。


在您的情况下,异常并没有真正的帮助,因为它没有提到 正确的替代品 。对于and并且or您可以使用(如果您想要逐元素比较):

或者只是|操作员:

    >>> x | y

或者只是&操作员:

    >>> x & y

如果您使用运算符,请确保正确设置括号,因为运算符优先级

几个逻辑 numpy
函数 应该在pandas.Series.


if如果您在执行或时遇到了异常中提到的替代方案,则更适合while。我将简要解释其中的每一个:

  • 如果您想检查您的系列是否为
    >>> x = pd.Series([])
    

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

如果没有明确的布尔解释,Python 通常将length 的容器(如list, , …)解释为真值。tuple因此,如果您想要类似
python 的检查,您可以这样做:if x.sizeif 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

2022-03-03