2016-01-27 19 views
12

In Pandas möchte ich eine berechnete Spalte erstellen, die eine boolesche Operation in zwei anderen Spalten ist.Logische Operation auf zwei Spalten eines Datenrahmens

In Pandas ist es einfach, zwei numerische Spalten zusammenzufassen. Ich möchte etwas Ähnliches mit dem logischen Operator AND machen. Hier ist mein erster Versuch:

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

Also ich denke, logische Operatoren funktionieren nicht ganz die gleiche Art und Weise wie numerische Operatoren in Pandas. Ich habe versucht zu tun, was die Fehlermeldung deutet darauf hin, und mit 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(). 

fand ich eine Art und Weise, die durch Gießen der boolean Spalten int und fügte hinzu, sie zusammen und Auswertung als boolean funktioniert.

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 

Dies ist verschachtelt. Gibt es einen besseren Weg?

Antwort

18

Ja, es gibt einen besseren Weg! Verwenden Sie einfach die & elementweise logische und Operator:

d.bar & d.foo 

0  True 
1 False 
2 False 
dtype: bool 
+2

Vielen Dank! Wird das überall in der Pandas-Dokumentation erwähnt? – dinosaur

+2

@dinosaur Ja, es gibt Beispiele für die Verwendung von '&' und '|' in [der booleschen Indizierung] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing) –

Verwandte Themen