2014-10-23 14 views
18

Angenommen, ich habe einen Datenrahmen df mit einer Spalte value mit einigen Float-Werte und einige NaN. Wie kann ich den Teil des Datenrahmens erhalten, in dem wir NaNmit der Abfragesyntax haben?Abfrage für NaN und andere Namen in Pandas

Die folgenden, zum Beispiel funktioniert nicht:

df.query('(value < 10) or (value == NaN)') 

ich name NaN is not defined erhalten (gleiche für df.query('value ==NaN'))

Generell gibt es eine Möglichkeit, numpy Namen in Query zu verwenden, wie inf , nan, pi, e usw.?

Antwort

44

Im Allgemeinen Sie @local_variable_name verwenden könnte, so etwas wie

>>> pi = np.pi; nan = np.nan 
>>> df = pd.DataFrame({"value": [3,4,9,10,11,np.nan,12]}) 
>>> df.query("(value < 10) and (value > @pi)") 
    value 
1  4 
2  9 

funktionieren würde, aber nan ist sich nicht gleich, so wird value == NaN immer falsch sein. Eine Möglichkeit, dies zu umgehen, besteht darin, diese Tatsache zu verwenden und value != value als isnan zu verwenden. Wir haben

>>> df.query("(value < 10) or (value == @nan)") 
    value 
0  3 
1  4 
2  9 

aber

>>> df.query("(value < 10) or (value != value)") 
    value 
0  3 
1  4 
2  9 
5 NaN 
+3

Es sollte eine bessere Möglichkeit, dies zu tun ... aber ich mag den Hack. –

+0

Der '@ nan'-Trick funktioniert * nicht * für' numpy' vars, z. 'nan = numpy.nan'. Es * funktioniert * um andere * Zeichenketten * herauszufiltern. – javadba

+0

@javadba: ähm, der ganze Punkt dieses Abschnitts soll zeigen, dass '(Wert == @nan)' _doesn_ nicht funktioniert, weil Nan nicht gleich selbst ist, daher meine Verwendung des 'value! = Wertes' Trick. – DSM

6

Sie so etwas tun könnte. Hinweis: Sie müssen das numpy (als np) Modul importieren

df[df['value'].apply(np.isnan)] 
+6

Die Frage bezieht sich speziell auf das Testen auf' NaN' mit 'query' Methode: http://pandas.pydata.org/pandas-docs/stable/generated/pandas .DataFrame.query.html # pandas.DataFrame.query – EdChum

+0

Ja, nur eine Alternative zur Verfügung stellen –

Verwandte Themen