Я читаю два столбца файла 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
случая?
qwerty
- это не число.None
было бы лучше описать значение пустой ячейки.Ответы:
NaN используется в качестве заполнителя для отсутствующих данных последовательно в панде , консистенция хорошая. Я обычно читаю / перевожу NaN как «отсутствующий» . Также см. Раздел «Работа с отсутствующими данными» в документации.
Уэс пишет в документах «Выбор NA-представления» :
Примечание: ошибка в том, что целочисленные серии, содержащие отсутствующие данные, преобразуются в числа с плавающей запятой .
На мой взгляд, основная причина использования 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')
Джефф комментирует это (ниже):
При этом многие операции могут работать так же хорошо с 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).источник
np.nan
разрешает векторизацию операций; это значение с плавающей запятой, в то время какNone
по определениюobject
принудительно вводит тип и в основном отключает всю эффективность в numpy, поэтому повторите 3 раза быстро:object==bad, float==good
<NA>
такжеnp.nan
?NaN
может использоваться как числовое значение для математических операций, ноNone
не может (или, по крайней мере, не должно).NaN
- числовое значение, как определено в стандарте IEEE 754 с плавающей запятой .None
является внутренним типом Python (NoneType
) и в этом контексте больше походил бы на «несуществующий» или «пустой», чем на «числовой недействительный».Главный «симптом» этого заключается в том, что если вы выполняете, скажем, среднее значение или сумму для массива, содержащего NaN, даже одного, в результате вы получите NaN ...
С другой стороны, вы не можете выполнять математические операции, используя в
None
качестве операнда.Таким образом, в зависимости от случая вы можете использовать его
None
как способ указать своему алгоритму не учитывать недопустимые или несуществующие значения при вычислениях. Это означало бы, что алгоритм должен проверять каждое значение, чтобы убедиться, что это такNone
.У Numpy есть несколько функций, позволяющих избегать значений NaN, которые могут испортить ваши результаты, например,
nansum
иnan_to_num
.источник
df=pd.readcsv('file.csv')
выдает мнеNaN
значения для пустых ячеек, а неNone
? Насколько мне известно, pd.DataFrames не являются исключительными для чисел.dtype
, поэтому недопустимые значенияdtype=float
должны быть представлены числовыми значениями, которыеNaN
есть иNone
не являются (None
естьNoneType
).na
аргумент, который позволяет вам решить, какое значение вы собираетесь использовать для замены недоступных значенийФункция
isnan()
проверяет, является ли что-то «Не числом», и возвращает значение, является ли переменная числом, напримерisnan(2)
, возвращает ложь.Условное
myVar is not None
выражение возвращает независимо от того, определена ли переменная.Ваш массив numpy использует,
isnan()
потому что он предназначен для массива чисел и инициализирует все элементы массива, чтобыNaN
эти элементы считались "пустыми"источник
isnan(2)
, вернусьFalse
, так как 2 не NaN.numpy.empty
не инициализирует значения массиваNaN
. Он просто вообще не инициализирует значения.None
-myVar is not None
нетmyVar != None
.np.isnan()
это не реализовано для строковых переменных, поэтому, если вы передадите ему строку, произойдет сбой. Лучше использовать тот,pd.isnull
который работает со строками.Ниже приведены отличия:
nan
принадлежит к классуfloat
None
принадлежит к классуNoneType
Я нашел следующую статью очень полезной: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
источник
NaN
означает НЕ число .None
может означать любой .источник