web-dev-qa-db-ja.com

データフレームの2列の論理演算

パンダでは、他の2つの列に対するブール演算である計算列を作成したいと思います。

パンダでは、2つの数値列を簡単に追加できます。論理演算子ANDで同様のことをしたいと思います。これが私の最初の試みです:

_In [1]: d = pandas.DataFrame([{'foo':True, 'bar':True}, {'foo':True, 'bar':False}, {'foo':False, 'bar':False}])

In [2]: d
Out[2]: 
     bar    foo
0   True   True
1  False   True
2  False  False

In [3]: d.bar and d.foo   ## can't
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
_

したがって、論理演算子はパンダの数値演算子とまったく同じようには機能しないと思います。エラーメッセージが示唆することをして、bool()を使用してみました:

_In [258]: d.bar.bool() and d.foo.bool()  ## spoiler: this doesn't work either
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
_

ブール列をintにキャストし、それらを足し合わせてブール値として評価することにより、動作する方法を見つけました。

_In [4]: (d.bar.apply(int) + d.foo.apply(int)) > 0  ## Logical OR
Out[4]: 
0     True
1     True
2    False
dtype: bool

In [5]: (d.bar.apply(int) + d.foo.apply(int)) > 1  ## Logical AND
Out[5]: 
0     True
1    False
2    False
dtype: bool
_

これは複雑です。もっと良い方法はありますか?

19
dinosaur

はい、もっと良い方法があります! &要素ごとの論理AND演算子:

d.bar & d.foo

0     True
1    False
2    False
dtype: bool
35
Kikohs