Ich habe ein Pandas- Series
Objekt, das boolesche Werte enthält. Wie kann ich eine Reihe erhalten, die die Logik NOT
jedes Werts enthält?
Stellen Sie sich zum Beispiel eine Reihe vor, die Folgendes enthält:
True
True
True
False
Die Serie, die ich bekommen möchte, würde enthalten:
False
False
False
True
Dies scheint einigermaßen einfach zu sein, aber anscheinend habe ich mein Mojo verlegt = (
object
Typen enthalten , damit die folgenden Antworten funktionieren. Verwenden Sie daher:~ df.astype('bool')
Antworten:
Verwenden Sie
~s
zum Invertieren einer booleschen Reihe :Verwenden von Python2.7, NumPy 1.8.0, Pandas 0.13.1:
Ab Pandas 0.13.0 sind Serien keine Unterklassen mehr von
numpy.ndarray
; Sie sind jetzt Unterklassen vonpd.NDFrame
. Dies könnte etwas damit zu tun haben, warumnp.invert(s)
es nicht mehr so schnell ist wie~s
oder-s
.Vorsichtsmaßnahme: Die
timeit
Ergebnisse können abhängig von vielen Faktoren variieren, einschließlich Hardware-, Compiler-, Betriebssystem-, Python-, NumPy- und Pandas-Versionen.quelle
-
?tilde
wie es in der Dokumentation erwähnt wurde, aber es hat nicht die gleiche Leistung erbracht wienp.invert
: Snp.invert(s)
,~s
und-s
sind alle gleich.np.bitwise_not(s)
funktioniert genauso wienp.inverse
).Die Antwort von @ unutbu ist genau richtig. Ich wollte nur eine Warnung hinzufügen, dass Ihre Maske vom Typ bool sein muss, nicht 'Objekt'. Dh deine Maske kann noch nie eine Nans gehabt haben . Sehen Sie hier - auch wenn Ihre Maske jetzt nanofrei ist, bleibt sie vom Typ "Objekt".
Die Umkehrung einer 'Objekt'-Reihe löst keinen Fehler aus. Stattdessen erhalten Sie eine Müllmaske mit Ints, die nicht wie erwartet funktioniert.
Nachdem ich mit Kollegen darüber gesprochen habe, habe ich eine Erklärung: Es sieht so aus, als würden Pandas zum bitweisen Operator zurückkehren:
Wie @geher sagt, können Sie es mit Astype in Bool konvertieren, bevor Sie mit ~ invertieren
quelle
.astype(bool)
zB~df['A'].astype(bool)
astype(bool)
es vor dem~
~df['A'].astype(bool)
vs(~df['A']).astype(bool)
Ich probiere es einfach aus:
quelle
-
! Ich werde dies für das nächste Mal berücksichtigen.Sie können auch verwenden
numpy.invert
:BEARBEITEN: Der Leistungsunterschied tritt unter Ubuntu 12.04, Python 2.7, NumPy 1.7.0 auf - scheint jedoch mit NumPy 1.6.2 nicht zu existieren:
quelle
NumPy ist langsamer, weil es die Eingabe in boolesche Werte umwandelt (also werden None und 0 zu False und alles andere zu True).
gibt Ihnen
wohingegen ~ s abstürzen würde. In den meisten Fällen wäre Tilde eine sicherere Wahl als NumPy.
Pandas 0,25, NumPy 1,17
quelle