2016-03-28 1 views
1

Ich erstelle ein Notebook und irgendwann muss ich eine boolesche Maske erstellen. Ich benutze Pandas Version 17.1.Wie benutzt man den NOT Operator ~ im Jupyter Notebook?

Das heißt, ich generieren

mask=df.var.str.contains('hello') 

Allerdings scheint es, dass ich nicht in der Lage bin den logischen Operator verwenden NICHT ~ in ipython Notebook, so ~mask generiert einen Fehler TypeError: bad operand type for unary ~: 'float'

Eigentlich läuft ~False in eine Zelle gibt mir: -1

Was passiert hier?

+0

Entschuldigung wegen dieses unglücklichen Variablennamens. In meinem Beispiel heißt die Variable tatsächlich myvariable. Also keine Verwechslung mit var möglich –

+3

Funktioniert für mich. Bitte posten Sie eine [mcve], die das Problem reproduziert. – Goyo

+1

Sie haben wahrscheinlich NaNs in 'df.myvariable' – TomAugspurger

Antwort

4

Ich konnte zwar Ihren Code nicht ausführen, aber nicht wegen ~ und nicht wegen des Notebooks - die .var Notation tut etwas, was Sie nicht erwarten.

Dies funktioniert:

mask=df['var'].str.contains('hello') 
~mask 

Dies ist jedoch beachten:

>>> type(df.var) 
instancemethod 

Im Allgemeinen, wenn die Punktnotation verwenden, haben Sie Kollisionen zwischen Namen und bereits existierenden Methoden zu prüfen. Sie hätten zum Beispiel ein ähnliches Problem mit einer Spalte namens size.

+1

Ich würde' ~ 'auch verwenden. Für die Zukunft, wenn Sie Regex-only Lösung wollen, könnten Sie negative Lookbehind Regex-Test tun - 'df ['var']. Str.contains (r '^ (? :(?! hallo).) * $')' – Zero

+0

Danke, @JohnGalt - weiß noch nicht wer du bist, aber :-) –