NaN được sử dụng như một trình giữ chỗ cho dữ liệu bị thiếu một cách nhất quán trong gấu trúc , tính nhất quán là tốt. Tôi thường đọc / dịch NaN là "mất tích" . Cũng xem phần 'làm việc với dữ liệu bị thiếu' trong tài liệu.
Wes viết trong tài liệu 'lựa chọn đại diện NA' :
Sau nhiều năm sử dụng trong sản xuất [NaN], ít nhất theo quan điểm của tôi, đã được chứng minh là quyết định tốt nhất dựa trên tình hình hoạt động của NumPy và Python nói 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 isnull
và notnull
có thể được sử dụng trên các kiểu để phát hiện giá trị NA.
...
Do đó, tôi đã chọn phương pháp tiếp cận "tính thực tế đánh bại độ tinh khiết" của Pythonic và giao dịch khả năng số nguyên NA cho một cách tiếp cận đơn giản hơn nhiều là sử dụng một giá trị đặc biệt trong mảng đối tượng và float để biểu thị NA, và thúc đẩy mảng số nguyên thành nổi khi NA phải là đã giới thiệu.
Lưu ý: "gotcha" mà Chuỗi số nguyên chứa dữ liệu bị thiếu được upcast để thả nổi .
Theo ý kiến của tôi, lý do chính để sử dụng NaN (trên Không) là nó có thể được lưu trữ với loại float64 của numpy, thay vì loại đối tượng kém hiệu quả hơn, hãy xem quảng cáo loại NA .
# 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 (bên dưới) về điều này:
np.nan
cho phép các hoạt động được vector hóa; của nó là một giá trị float, trong khi None
theo định nghĩa, buộc kiểu đối tượng, về cơ bản vô hiệu hóa tất cả hiệu quả trong numpy.
Vì vậy, lặp lại nhanh 3 lần: object == bad, float == good
Nói vậy, nhiều thao tác có thể vẫn hoạt động tốt với None vs NaN (nhưng có lẽ không được hỗ trợ, tức là đôi khi chúng có thể cho kết quả đáng ngạc nhiên ):
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.isnull
và pd.notnull
kiểm tra dữ liệu bị thiếu (NaN).
qwerty
không phải là một con số.