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