1. ホーム
  2. python

[解決済み] シリーズの真偽値が曖昧である。a.empty, a.bool(), a.item(), a.any(), a.all() のいずれかを使用します。

2022-03-15 10:17:45

質問

結果データフレームをフィルタリングするのに問題があります。 or という条件があります。結果を df を抽出し、すべてのカラム var の値が 0.25 以上、-0.25 未満であることを示す。

このロジックは曖昧な真理値を与えますが、このフィルタリングを2つの別々のオペレーションに分割すると動作します。ここで何が起こっているのでしょうか? 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 はあいまいな表現なので、ビットワイズで表現する必要があります。 | (または)または & (and)操作を行う。

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

これらは,この種のデータ構造に対してオーバーロードされ,要素ごとの or (または and ).


この文章にもう少し説明を加えておきます。

を取得しようとすると例外が発生します。 boolpandas.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 が、念のため、これらについて触れておきたいと思います。


あなたの場合、例外はあまり役に立ちません。 右の代替案 . について 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 .


を行う際に遭遇した場合は、Exceptionに記載されている代替案が適しています。 if または while . それぞれについて簡単に説明します。

  • あなたのSeriesが :

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

    Python は通常 len コンテナ(例えば list , tuple を真理値として解釈します。つまり、pythonのようなチェックをしたいのであれば 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
    
    
  • を確認したい場合 すべて または 任意の の項目が0でない、空でない、または偽でないこと。

    >>> 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