В чем разница между NaN и None?


я читаю два столбца csv-файла с помощью pandas readcsv() и затем присвоение значений словарю. Столбцы содержат строки цифр и букв. Иногда бывают случаи, когда ячейка пуста. На мой взгляд, значение чтения этой словарной статьи должно быть None но вместо nan назначена. Конечно None больше описывает пустую ячейку, поскольку она имеет нулевое значение, тогда как nan просто говорит о том, что значение не является числом.

мой понимание правильное, в чем разница между None и nan? Почему это nan назначенный вместо None?

кроме того, моя проверка словаря для любых пустых ячеек использует numpy.isnan():

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

но это дает мне ошибку, говоря, что я не могу использовать эту проверку для v. Я думаю, это потому, что целочисленная или плавающая переменная, а не строка предназначена для использования. Если это правда, как я могу проверить v для "пустой ячейки"/nan случае?

4 62

4 ответа:

NaN используется в качестве заполнителя для данные отсутствуют последовательно в пандах, консистенция хорошая. Я обычно читаю / перевожу NaN как "пропал без вести". Смотрите также 'работа с недостающими данными' раздел в документах.

Уэс пишет в документах 'выбор NA-представления':

После лет пользы продукции [NaN] доказывал, по крайней мере в моем мнении, быть лучшее решение, учитывая состояние дел в numpy и Python в целом. Используется специальное значение NaN (Not-a-Number)везде как значение NA, и есть функции API isnull и notnull который можно использовать через dtypes для того чтобы обнаружить значения NA.
...
Таким образом, я выбрал подход Pythonic "практичность бьет чистоту" и обменял целочисленную способность NA на гораздо более простой подход использования специального значения в float и объектные массивы для обозначения NA, и продвижение целочисленных массивов к плавающей, когда NAs должен быть введен.

Примечание: "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 раза быстро: объект= = плохо, поплавок= = хорошо

говоря, что многие операции все еще могут работать так же хорошо, как и без vs NaN (но, возможно, не поддерживаются т. е. они могут иногда давать удивительные результаты):

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

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

чтобы ответить на второй вопрос:
Вы должны использовать pd.isnull и pd.notnull для проверки на отсутствие данных (NaN).

NaN может использоваться как числовое значение для математических операций, в то время как None не может (или по крайней мере не должны).

NaN - это числовое значение, определенное в стандарт IEEE 754 с плавающей запятой. None является внутренним Python tipe (NoneType) и было бы больше похоже на "несуществующий" или "пустой", чем "численно недействительный" в этом контексте.

главным "симптомом" этого является то, что, если вы выполняете, скажем, среднее или сумму на массиве, содержащем НАН, даже один, вы получаете Нан в результате...

С другой стороны, вы не можете выполнять математические операции с помощью None в качестве операнда.

так что, в зависимости от случая, вы можете использовать None как способ сказать вашему алгоритму, чтобы он не рассматривал недопустимые или несуществующие значения при вычислениях. Это означает, что алгоритм должен проверить каждое значение, чтобы увидеть, если это None.

Numpy имеет некоторые функции, чтобы избежать значений NaN, чтобы загрязнить ваши результаты, такие как nansum и nan_to_num например.

функции isnan() проверяет, является ли что-то "не числом" и возвращает ли переменная число, например isnan(2) вернет false

условный myVar is not None возвращает независимо от того, определена ли переменная

Ваш массив numpy использует isnan() потому что он предназначен для массива чисел и инициализирует все элементы массива в NaN эти элементы считаются "пустыми"

NaN stants for не.
None может означать любой.