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
の場合にも発生します)。and
if
while
>>> 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
、要素ごとの比較が必要な場合は、次を使用できます。
-
>>> import numpy as np >>> np.logical_or(x, y)
または単に
|
演算子:>>> x | y
-
>>> 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.size
if not x.empty
if 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