Pandas のブールインデックスの論理演算子 質問する

Pandas のブールインデックスの論理演算子 質問する

私は Pandas でブールインデックスを操作しています。

問題は、なぜ次のような発言がなされるのかということです。

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

ベストアンサー1

あなたが言う時

(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() を使用してください。

ブール値として使用される場合は、いつそれが真実か偽か不明である. Python リストのように長さがゼロでない場合は True であると想定するユーザーもいます。すべての要素が True の場合にのみ 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。 を 2 つの Series で使用すると、上記とand同じ結果になりますValueError。このため、括弧は必須です。

おすすめ記事