2014-10-23 15 views
18

Giả sử tôi có một khung dữ liệu df với một cột value giữ một số giá trị nổi và một số NaN. Làm cách nào tôi có thể nhận được một phần của khung dữ liệu nơi chúng tôi có NaNsử dụng cú pháp truy vấn?Truy vấn NaN và các tên khác trong Pandas

Sau đây, ví dụ, không hoạt động:

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

tôi nhận được name NaN is not defined (tương tự cho df.query('value ==NaN'))

Nói chung, là có cách nào để sử dụng tên NumPy trong truy vấn, chẳng hạn như inf , nan, pi, e, v.v ...?

Trả lời

44

Nói chung, bạn có thể sử dụng @local_variable_name, vì vậy cái gì đó như

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

sẽ làm việc, nhưng nan không bằng bản thân, vì vậy value == NaN sẽ luôn luôn sai. Một cách để giải quyết vấn đề này là sử dụng thực tế đó và sử dụng value != value làm séc isnan. Chúng tôi có

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

nhưng

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

Nên có cách tốt hơn để làm điều này ... nhưng tôi thích bản hack. –

+0

Bí quyết '@ nan'" là * không * hoạt động đối với các vars 'numpy', ví dụ: 'nan = numpy.nan'. Nó * làm * để lọc ra các chuỗi * khác *. – javadba

+0

@javadba: er, toàn bộ điểm của phần đó là để chỉ ra rằng '(giá trị == @nan)' _doesn't_ hoạt động, bởi vì nan không bằng chính nó, do đó việc sử dụng 'giá trị! = Giá trị' của tôi lừa. – DSM

6

Bạn có thể làm một cái gì đó như thế này. Lưu ý: bạn sẽ cần phải nhập mô-đun gọn gàng (dưới dạng np)

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

câu hỏi cụ thể là về thử nghiệm cho' NaN' bằng phương thức 'truy vấn': http://pandas.pydata.org/pandas-docs/stable/generated/pandas .DataFrame.query.html # pandas.DataFrame.query – EdChum

+0

Đúng, chỉ cần cung cấp giải pháp thay thế –

Các vấn đề liên quan