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?
Vielen Dank! Wird das überall in der Pandas-Dokumentation erwähnt? – dinosaur
@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) –