シリーズの真理値はあいまいです。a.empty、a.bool()、a.item()、a.any()、または a.all() を使用してください。質問する

シリーズの真理値はあいまいです。a.empty、a.bool()、a.item()、a.any()、または a.all() を使用してください。質問する

or特定の列の値が範囲外である行を保持する条件でデータフレームをフィルタリングしたいと思います[-0.25, 0.25]。試しました:

df = df[(df['col'] < -0.25) or (df['col'] > 0.25)]

しかし、次のエラーが発生します:

ValueError: シリーズの真理値があいまいです。a.empty、a.bool()、a.item()、a.any()、または a.all() を使用してください。

ベストアンサー1

Pythonのorおよびandステートメントには真理値が必要です。Pandas の場合、これらはあいまいとみなされるため、「ビット単位の」|(or) または&(and) 演算を使用する必要があります。

df = df[(df['col'] < -0.25) | (df['col'] > 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 つのステートメントの他に、いくつかの呼び出しを非表示にする Python 関数がいくつかありますbool( any、、、... など)。これらは通常、 では問題になりませんが、完全性を保つためにこれらallについて言及したいと思います。filterpandas.Series


あなたの場合、例外は正しい選択肢について言及していないため、あまり役に立ちません。andおよび についてはor、要素ごとの比較が必要な場合は、次を使用できます。

  • 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


ifまたは を実行しているときに例外が発生した場合は、例外で説明されている代替手段の方が適していますwhile。それぞれについて簡単に説明します。

  • シリーズが空かどうか確認したい場合:

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

    Python は通常、明示的なブール解釈がない場合、lenコンテナの gth ( list、、 ... など) を真理値として解釈します。したがって、Python のようなチェックが必要な場合は、の代わりに次のようにtuple実行できます。if x.sizeif not x.emptyif x

  • ブール値が1 つだけSeries含まれている場合:

    >>> x = pd.Series([100])
    >>> (x > 50).bool()
    True
    >>> (x < 50).bool()
    False
    
  • Series の最初で唯一の項目をチェックしたい場合( などです.bool()が、ブール値以外のコンテンツでも機能します) :

    >>> x = pd.Series([100])
    >>> x.item()
    100
    
  • すべての項目またはいずれかの項目がゼロでない、空でない、または False でないかどうかを確認する場合:

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

おすすめ記事