2013-07-08 37 views
50

Tôi đang đọc hai cột của tệp csv bằng cách sử dụng gấu trúc readcsv() và sau đó gán giá trị cho từ điển. Các cột chứa các chuỗi số và chữ cái. Thỉnh thoảng có những trường hợp ô trống. Theo ý kiến ​​của tôi, giá trị được đọc cho mục nhập từ điển đó phải là None nhưng thay vào đó, nan được chỉ định. Chắc chắn None mô tả chi tiết hơn về ô trống vì nó có giá trị null, trong khi nan chỉ nói rằng giá trị được đọc không phải là số.Sự khác nhau giữa NaN và None là gì?

Sự hiểu biết của tôi có đúng không, sự khác nhau giữa Nonenan là gì? Tại sao nan được chỉ định thay vì None?

Ngoài ra, kiểm tra từ điển của tôi đối với bất kỳ ô trống đã được sử dụng numpy.isnan():

for k, v in my_dict.iteritems(): 
    if np.isnan(v): 

Nhưng điều này mang lại cho tôi một lỗi nói rằng tôi không thể sử dụng việc kiểm tra này cho v. Tôi đoán nó là bởi vì một số nguyên hoặc biến float, không phải là một chuỗi có nghĩa là để được sử dụng. Nếu điều này đúng, làm cách nào tôi có thể kiểm tra v cho trường hợp "ô trống"/nan?

+0

Văn bản 'qwerty' không phải là số. –

+1

@RobertHarvey Tôi biết, vì vậy chắc chắn 'None' sẽ là mô tả tốt hơn về giá trị của một ô trống. – user1083734

+0

@ user1083734 câu trả lời của tôi mô tả rằng – Stephan

Trả lời

49

NaN được sử dụng làm trình giữ chỗ cho missing data consistently in pandas, tính nhất quán là tốt. Tôi thường đọc/dịch NaN dưới dạng "bị thiếu". Cũng xem phần 'working with missing data' trong tài liệu.

Wes viết trong các tài liệu 'choice of NA-representation':

Sau nhiều năm sử dụng sản xuất [NaN] đã chứng minh, ít nhất là trong quan điểm của tôi, để được quyết định tốt nhất cho tình trạng của các vấn đề trong NumPy và Python trong chung. Giá trị đặc biệt NaN (Not-A-Number) được sử dụng ở mọi nơi làm giá trị NA và có các hàm API isnullnotnull có thể được sử dụng trên các kiểu dtypes để phát hiện giá trị NA.
...
Do đó, tôi đã chọn phương pháp "thực tế nhịp nhàng tinh khiết" và giao dịch số nguyên NA cho phương pháp đơn giản hơn nhiều bằng cách sử dụng một giá trị đặc biệt trong mảng float và đối tượng để biểu thị NA và quảng bá mảng nguyên khi NA phải được giới thiệu.

Lưu ý: "gotcha" that integer Series containing missing data are upcast to floats.

Theo tôi lý do chính để sử dụng NaN (trên None) là nó có thể được lưu trữ với dtype float64 NumPy của, chứ không phải là đối tượng dtype kém hiệu quả, thấy NA type promotions.

# without forcing dtype it changes None to NaN! 
s_bad = pd.Series([1, None], dtype=object) 
s_good = pd.Series([1, np.nan]) 

In [13]: s_bad.dtype 
Out[13]: dtype('O') 

In [14]: s_good.dtype 
Out[14]: dtype('float64') 

Jeff bình luận (ở dưới) về vấn đề này:

np.nan phép cho các hoạt động vectorized; giá trị float của nó, trong khi None, theo định nghĩa, loại đối tượng lực, về cơ bản vô hiệu hóa tất cả hiệu quả trong khối u.

Vì vậy, lặp lại 3 lần nhanh: đối tượng == xấu, nổi == tốt

Nói rằng, nhiều hoạt động vẫn có thể hoạt động ngang ngửa với Không vs NaN (nhưng có lẽ là không được hỗ trợ tức là họ đôi khi có thể cung cấp cho surprising results):

In [15]: s_bad.sum() 
Out[15]: 1 

In [16]: s_good.sum() 
Out[16]: 1.0 

Để trả lời câu hỏi thứ hai:
Bạn nên sử dụng pd.isnullpd.notnull để kiểm tra dữ liệu bị thiếu (NaN).

+9

chỉ cần thêm 2c ở đây .... '' np.nan'' cho phép các hoạt động được vector hóa; giá trị float của nó, trong khi '' None'' theo định nghĩa buộc '' object'' loại, và về cơ bản vô hiệu hóa tất cả hiệu quả trong numpy, vì vậy lặp lại 3 lần nhanh: '' object == bad, float == good'' – Jeff

+0

xem cũng: http://stackoverflow.com/a/19866269/1240268 –

-2

NaN stants cho KHÔNG phải là số.
None có thể đứng cho bất kỳ.

2

Chức năng isnan() kiểm tra xem nếu có điều gì là "Not A Number" và sẽ trở lại hay không một biến là một số, ví dụ isnan(2) sẽ trả về false

Các điều kiện myVar is not None lợi nhuận hay không biến là định nghĩa

mảng numPy của bạn sử dụng isnan() bởi vì nó được thiết kế để trở thành một mảng các con số và nó khởi tạo tất cả các yếu tố của mảng để NaN những yếu tố được coi là "trống rỗng"

+1

Tôi nghĩ 'isnan (2)' sẽ trả về 'False', vì 2 không phải là NaN. – heltonbiker

+0

Ngoài ra, 'numpy.empty' không khởi tạo các giá trị mảng thành' NaN'. Nó chỉ đơn giản là không khởi tạo các giá trị ở tất cả. – heltonbiker

+0

@heltonbiker idk những gì tôi đã suy nghĩ – Stephan

7

NaN có thể được sử dụng như một giá trị số trên các phép toán, trong khi None không thể (hoặc ít nhất là không nên).

NaN là giá trị số, như được định nghĩa trong IEEE 754 floating-point standard. None là một tipe Python bên trong (NoneType) và sẽ giống như "không tồn tại" hoặc "trống" hơn "số không hợp lệ" trong ngữ cảnh này.

Các chính "triệu chứng" đó là, nếu bạn thực hiện, nói rằng, trung bình hoặc một khoản tiền vào một mảng chứa NaN, thậm chí một duy nhất, bạn sẽ có được NaN kết quả là ...

Trong Mặt khác, bạn không thể thực hiện các phép toán bằng cách sử dụng None làm toán hạng.

Vì vậy, tùy thuộc vào từng trường hợp, bạn có thể sử dụng None làm cách để cho thuật toán của mình không xem xét các giá trị không hợp lệ hoặc không tồn tại trên tính toán. Điều đó có nghĩa là thuật toán sẽ kiểm tra từng giá trị để xem liệu nó có phải là None hay không.

Numpy có một số chức năng để tránh các giá trị NaN gây ô nhiễm kết quả của bạn, chẳng hạn như nansumnan_to_num chẳng hạn.

+0

Tôi đồng ý với bạn rằng Không nên được sử dụng cho các mục không tồn tại, vậy tại sao 'df = pd.readcsv ('file.csv')' cho tôi giá trị 'NaN' cho các ô trống và không phải là' None'? Theo tôi biết, pd.DataFrames không dành riêng cho số. – user1083734

+0

Vâng, nó có lẽ là một sự lựa chọn thiết kế. Tôi cho rằng DataFrames và Series có một 'dtype', vì vậy các giá trị không hợp lệ của' dtype = float' phải được biểu diễn bằng các giá trị số, 'NaN' là và' None' không ('None' là' NoneType'). – heltonbiker

+0

Ngoài ra, rất nhiều phương thức Pandas có đối số 'na', cho phép bạn quyết định giá trị nào bạn sẽ sử dụng để thay thế các giá trị không có sẵn – heltonbiker