2013-07-31 25 views
7

Tôi không hiểu cách thức NaN đang được xử lý trong gấu trúc, sẽ rất vui khi nhận được một số lời giải thích, bởi vì logic dường như "bị hỏng" với tôi.Thả NaN từ một dữ liệu gấu trúcFrame

Tôi có tệp csv, tải im bằng cách đọc csv. tôi có một cột "bình luận" trong tập tin đó, phần lớn trống rỗng.

Tôi đã phân lập cột đó và thử thay đổi các cách để xóa các giá trị trống. đầu tiên, khi im viết:

marked_results.comments 

tôi nhận được:

0  VP 
1  VP 
2  VP 
3  TEST 
4  NaN 
5  NaN 
.... 

Phần còn lại của cột là NaN. vì vậy gấu sẽ tải các mục trống dưới dạng NaN. tuyệt vời cho đến nay. Hiện tại, tôi đang cố gắng xóa các mục nhập đó. Iv đã thử:

marked_results.comments.dropna() 

và nhận được cùng một cột. không có gì bị bỏ. bối rối, tôi đã cố gắng hiểu lý do tại sao không có gì bị bỏ, vì vậy tôi đã thử:

marked_results.comments==NaN 

và nhận một loạt các Falses. Không có gì là NaN ... khó hiểu. sau đó tôi đã thử:

marked_results.comments==nan 

Và một lần nữa, không có gì ngoài việc bị giả mạo. Tôi có một chút tức giận ở đó, và được cho là thông minh hơn. vì vậy tôi đã làm:

In [71]: 
comments_values = marked_results.comments.unique() 
comments_values 
Out[71]: 
array(['VP', 'TEST', nan], dtype=object) 

Ah, gotya! vì vậy bây giờ ive đã thử:

marked_results.comments==comments_values[2] 

và đáng ngạc nhiên, vẫn còn tất cả kết quả là Falses !!! điều duy nhất hoạt động là:

marked_results.comments.isnull() 

sẽ trả lại kết quả mong muốn. Ai đó có thể giải thích những gì đã xảy ra ở đây không ??

+1

[NaN! = NaN] (http: // stackoverflow.com/questions/1565164/what-is-the-lý do-cho-tất cả-so sánh-return-false-cho-ieee754-nan-giá trị) - đọc trả lời được chấp nhận của Stephen Canon. – fvu

Trả lời

14

Bạn nên sử dụng isnullnotnull để kiểm tra NaN (đây là những mạnh mẽ hơn bằng gấu trúc dtypes hơn NumPy), xem "values considered missing" in the docs.

Sử dụng Series phương pháp dropna trên một cột sẽ không ảnh hưởng đến dataframe gốc, nhưng làm những gì bạn muốn:

In [11]: df 
Out[11]: 
    comments 
0  VP 
1  VP 
2  VP 
3  TEST 
4  NaN 
5  NaN 

In [12]: df.comments.dropna() 
Out[12]: 
0  VP 
1  VP 
2  VP 
3 TEST 
Name: comments, dtype: object 

Các dropnaDataFrame phương pháp có một cuộc tranh luận tập hợp con (để thả hàng có Nans trong các cột cụ thể):

In [13]: df.dropna(subset=['comments']) 
Out[13]: 
    comments 
0  VP 
1  VP 
2  VP 
3  TEST 

In [14]: df = df.dropna(subset=['comments']) 
7

Bạn cần kiểm tra NaN với chức năng math.isnan() (Hoặc numpy.isnan). Không thể kiểm tra NaN bằng toán tử bình đẳng.

>>> a = float('NaN') 
>>> a 
nan 
>>> a == 'NaN' 
False 
>>> isnan(a) 
True 
>>> a == float('NaN') 
False 

Trợ giúp Chức năng ->

isnan(...) 
    isnan(x) -> bool 

    Check if float x is not a number (NaN). 
+0

Cảm ơn rất nhiều, đã phân loại sự nhầm lẫn .. – idoda

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