直列の真値が曖昧です。a.empty、a.bool()、a.item()、a.any()、またはa.all()を使用してください。

python pandas dataframe boolean filtering


or 条件で結果データフレームのフィルタリングに問題があります。結果 df で、0.25より大きく、-0.25より小さいすべての列 var 値を抽出します。

以下のこのロジックは、あいまいな真理値を与えますが、このフィルタリングを2つの個別の操作に分割すると機能します。ここで何が起きてるの?提案された a.empty(), a.bool(), a.item(),a.any() or a.all() どこで使用するかわからない。

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



Answer 1 MSeifert


orand pythonのステートメントは、必要と truth -値を。以下のために pandas あなたが「ビット単位」を使用する必要がありますので、これらはあいまいと見なされます | (または)または & (および)操作:

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

これらは、これらの種類のデータ構造に対してオーバーロードされ、要素ごとの or (または and )を生成します。


この文にもう少し説明を加えるだけです。

例外は、 pandas.Seriesbool を取得するときにスローされます。

>>> 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 呼び出し( anyallfilter など)を非表示にするいくつかのpython関数があります。これらは通常、 pandas.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 listtuple 、それが明示的なブール解釈を持っていない場合は、真理値などを、...)。したがって、pythonのようなチェックが必要な場合は、次のようにすることができます if x.size if x 代わりにif x.sizeまたは if not x.empty

  • あなたの場合は 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



Answer 2 Alexander


ブール論理の場合は、 &| を使用します 。

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

複数の基準がある場合、複数の列が返されます。これが、結合ロジックがあいまいな理由です。 and または or を使用して各列を個別に処理するため、最初にその列を単一のブール値に減らす必要があります。たとえば、各列のいずれかの値またはすべての値が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

詳細については、ドキュメントのブールインデックスを参照してください。




Answer 3 Nipun


まあパンダはビットごとの「&」「|」を使用します 各条件は '()'でラップする必要があります

例えば、以下のような作品があります。

data_query = data[(data['year'] >= 2005) & (data['year'] <= 2010)]

しかし、適切な括弧を付けずに同じクエリを実行しても

data_query = data[(data['year'] >= 2005 & data['year'] <= 2010)]



Answer 4 Cảnh Toàn Nguyễn


または、演算子モジュールを使用することもできます。詳細情報はこちら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



Answer 5 bli


この優れた答えは、何が起こっているかを非常によく説明し、解決策を提供します。同様の場合に適した別のソリューションを追加したいと思い query メソッドを使用します。

result = result.query("(var > 0.25) or (var < -0.25)")

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-queryもご覧ください。

(現在使用しているデータフレームを使用したいくつかのテストでは、この方法は一連のブール値でビットごとの演算子を使用するよりも少し遅い:2 ms vs 870 µs)

警告の一部:これが簡単ではない少なくとも1つの状況は、列名がたまたまpython式である場合です。 WT_38hph_IP_2WT_38hph_input_2 、および log2(WT_38hph_IP_2/WT_38hph_input_2) という名前の列があり、次のクエリを実行する必要がありました: "(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"

以下の例外カスケードを取得しました。

  • KeyError: 'log2'
  • UndefinedVariableError: name 'log2' is not defined
  • ValueError: "log2" is not a supported function

これは、クエリパーサが3番目の列の名前で式を識別するのではなく、最初の2つの列から何かを作ろうとしていたために起こったのだと思います。

可能な回避策はここに提案されます。