В чем разница между NaN и None? - программирование
Подтвердить что ты не робот

В чем разница между 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. Я предполагаю, что это потому, что предполагается использовать переменную integer или float, а не строку. Если это так, как я могу проверить v для случая "пустой ячейки" /nan?

4b9b3361

Ответ 1

NaN используется в качестве заполнителя для отсутствующих данных последовательно в pandas, согласованность - это хорошо. Обычно я читаю/перевод NaN как "отсутствует" . Также см. Раздел "Работа с отсутствующими данными" в документах.

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

После лет производства использование [NaN] доказало, по крайней мере, на мой взгляд, лучшее решение, учитывая состояние дел в NumPy и Python в целом. Специальное значение NaN (Not-A-Number) используется везде как значение NA, и существуют функции API isnull и notnull, который можно использовать в dtypes для определения значений NA.
...
Таким образом, я выбрал подход Pythonic "практичность превосходит чистоту" и торговал целочисленными возможностями 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 допускает векторизованные операции; его значение float, а None, по определению, заставляет тип объекта, который в основном отключает всю эффективность в numpy.

Повторите 3 раза быстрее: объект == bad, float == good

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

Функция isnan() проверяет, является ли что-то "Not A Number" и вернет, является ли переменная числом, например isnan(2) вернет false

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

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

Ответ 4

NaN stants для НЕ число.
None может стоять любой.