NaN використовується в якості заповнювача для відсутніх даних послідовно в панді , консистенція хороша. Я зазвичай читаю / перекладаю NaN як "відсутній" . Також див. Розділ "Робота з відсутніми даними" у документах.
Уес пише в документах "вибір NA-представлення" :
Після багатьох років виробничого використання [NaN] виявилося, принаймні на мій погляд, найкращим рішенням з огляду на стан справ у NumPy та Python загалом. Спеціальне значення NaN (Not-A-Number) використовується всюди в якості значення NA, і є функції API , isnull
і notnull
які можуть бути використані через dtypes для виявлення значення NA.
...
Таким чином, я вибрав пітонічний підхід "практичність перевершує чистоту" і обміняв цілочисельну здатність NA для набагато простішого підходу до використання спеціального значення в масивах float та object для позначення NA та просування цілочисельних масивів до плаваючих, коли NA повинні бути введено.
Примітка: "gotcha", що цілі ряди, що містять відсутні дані, оновляються до плаваючих .
На мій погляд, головною причиною використання NaN (над None) є те, що його можна зберігати з використанням типу numpy float64 dtype, а не менш ефективним об'єктом dtype, див. Акції типу 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')
Джефф коментує (нижче) це:
np.nan
дозволяє векторизовані операції; це плаваюче значення, тоді як None
, за визначенням, змушує тип об'єкта, що в основному відключає всю ефективність в numpy.
Тож повторіть 3 рази швидко: object == bad, float == good
Говорячи про це, багато операцій все ще можуть працювати так само добре з None проти NaN (але, можливо, не підтримуються, тобто іноді можуть давати дивовижні результати ):
In [15]: s_bad.sum()
Out[15]: 1
In [16]: s_good.sum()
Out[16]: 1.0
Щоб відповісти на друге запитання:
Ви повинні використовувати pd.isnull
і pd.notnull
перевірити відсутність даних (NaN).
qwerty
не є числом.