В чем разница между 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 ответа:
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эти элементы считаются "пустыми"