私は 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
。このため、括弧は必須です。