2014-10-23 10 views
18

Powiedz, że mam ramkę danych df z kolumną value z pewnymi wartościami zmiennoprzecinkowymi i pewną liczbą NaN. Jak mogę uzyskać część ramki danych, w której mamy NaNprzy użyciu składni zapytań?Kwerendowanie dla NaN i innych nazw w Pandach

dodaje się, na przykład, nie działa:

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

uzyskać name NaN is not defined (taki sam dla df.query('value ==NaN'))

Ogólnie rzecz biorąc, czy jest jakiś sposób, aby używać nazw NumPy w zapytaniu, takich jak inf , nan, pi, e itp.?

Odpowiedz

44

Ogólnie, można użyć @local_variable_name, więc coś

>>> 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 

będzie działać, ale nan nie jest równe sobie, tak value == NaN zawsze będzie fałszywa. Jednym ze sposobów na obejście tego problemu jest użycie tego faktu i użycie opcji value != value jako czeku isnan. Mamy

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

ale

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

Powinien być lepszy sposób robienia tego ... ale lubię hack. –

+0

Sztuczka '@ nan'" to * nie * działa dla 'numpy' vars np. 'nan = numpy.nan'. * Działa * w celu odfiltrowania innych * ciągów *. – javadba

+0

@javadba: er, cały punkt tej sekcji to pokazanie, że '(value == @nan)' _doesn't_ work, ponieważ nan nie jest równy sobie, stąd moje użycie 'value! = Value' sztuczka. – DSM

6

Można zrobić coś takiego. Uwaga: musisz zaimportować moduł numpy (jako np)

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

pytanie dotyczy konkretnie testowania' NaN' przy użyciu 'query' method: http://pandas.pydata.org/pandas-docs/stable/generated/pandas .DataFrame.query.html # pandas.DataFrame.query – EdChum

+0

Tak, tylko dostarczając alternatywę –

Powiązane problemy