1. ホーム
  2. パイソン

[解決済み】Pandasでブールインデックスのための論理演算子

2022-04-16 01:32:38

質問

PandasでBooleanインデックスを扱っています。

問題は、なぜこの文なのかです。

a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]

は正常に動作するのに対し

a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]

はエラーで終了しますか?

a = pd.DataFrame({'x':[1,1],'y':[10,20]})

In: a[(a['x']==1)&(a['y']==10)]
Out:    x   y
     0  1  10

In: a[(a['x']==1) and (a['y']==10)]
Out: ValueError: The truth value of an array with more than one element is ambiguous.     Use a.any() or a.all()

解決方法は?

と言われたら

(a['x']==1) and (a['y']==10)

あなたは暗黙のうちにPythonに次のように変換するよう求めています。 (a['x']==1)(a['y']==10) をブール値に変換する。

NumPyの配列(1以上の長さ)やSeriesなどのPandasのオブジェクトは、ブール値を持ちません。

ValueErrorです。配列の真理値があいまいです。a.empty、a.any()、a.all()のいずれかを使用します。

をブール値として使用する場合。それは、それが TrueとFalseのどちらであるべきかが不明確 . Pythonのリストのように、長さが0でなければTrueとするユーザもいるかもしれません。また、次のような場合にのみTrueにすることを望む人もいるかもしれません。 すべて の要素が真である。また、次のような場合に真であってほしいと思うかもしれません。 任意の の要素がTrueになります。

多くの矛盾した期待があるため、NumPyとPandasの設計者は推測を拒否し、代わりにValueErrorを発生させます。

その代わり、明示的に empty() , all() または any() メソッドで、どちらの動作を希望するかを指定します。

しかし、この場合、ブール値の評価は必要ないようです。 要素別 ロジカルアンド それが & 二項演算子で実行されます。

(a['x']==1) & (a['y']==10)

はブーリアン配列を返します。


ちなみに alexpmilノート , のため、括弧は必須です。 & は、より高い 演算子の優先順位 よりも == .

括弧を除いたもの。 a['x']==1 & a['y']==10 は次のように評価されます。 a['x'] == (1 & a['y']) == 10 という連鎖式比較と同じになります。 (a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10) . それは、次のような式です。 Series and Series . の使用は and を2つのSeriesで使用すると、再び同じ ValueError と同じです。そのため、括弧は必須です。