Я работаю на python и начал изучать анализ данных, и в качестве первого шага к анализу данных в Python я начал с Numpy, а затем переключился на Pandas. Я столкнулся с термином NaN in Numpy
и часто используется в pandas, потому что Numpy является строительным блоком Pandas Dataframes. Я знал о None in Python
, но у меня возник следующий вопрос:
→Что такое фактический difference between None and NaN
, который обычно сбивает с толку новичков.
Давайте сначала изучим тип обоих .
import numpy as np type(np.nan) type(None) float NoneType
np.nan is a float
и None is an Object of NoneType
np.nan
— это представление с плавающей запятой IEEE 754 для Not a Number (NaN)
, то есть для python built-in numeric type float
.
И, None indicates an Object which has no value
. Интересно, что любая функция, которая ничего не возвращает, Явно не возвращает None неявно. Попробуйте следующее:
print(print("This is cool"))
Что мы можем интерпретировать из того, что NaN является числом с плавающей запятой, а None — объектом? Одна вещь, которая приходит на ум, это арифметические операции:
Мы may apply operations with NaN but not with None
, проверьте следующее:
np.nan + np.nan or np.nan + 5 np.nan - np.nan or np.nan - 5 np.nan * np.nan or np.nan * 5 np.nan / np.nan or np.nan / 5 np.nan % np.nan or np.nan % 5 Output: nan None+None Output: Type Error : unsupported operand type(s)
Вы можете думать о
NaN
как о информационном вирусе — он заражает любой другой объект, к которому прикасается. Независимо от операции результатом арифметики сNaN
всегда будет другоеNaN
.
Давайте рассмотрим еще один интересный момент о NaN, касающийся equality and identity
того же !!
np.nan == np.nan False np.nan is np.nan True
Примечание. Python генерирует и присваивает идентификатор каждой переменной, мы можем использовать идентификатор (var) и
id is what gets compared when we use "is" operator in python
Под равенством мы подразумеваем, что содержимое обеих сравниваемых переменных одинаково и
content is what get compared when we use “==’ operator in python
Теперь, если мы проверим идентификатор (np.nan), он будет таким же:
Но в случае None все по-другому:
Еще один момент, на который стоит обратить внимание в отношении NaN, заключается в следующем:
NaN
является значением с плавающей запятой; нет эквивалентного значения NaN для целых чисел, строк или других типов.
None и NaN в Pandas: - NaN
и None
оба имеют свое место, и Pandas построен на handle the two of them nearly interchangeably
, при необходимости конвертируя между ними. Давайте посмотрим то же самое на примере.
Давайте создадим ряд с массивом целых чисел, а затем просто заменим один элемент ряда на «Нет» и заметим изменение dtype.
s1 = pd.Series([1,2,3,4], name="integer_series") print(s1.dtype) --> int64 s1[0] = None print(s1.dtype) --> float64
Таким образом, вводя None в целочисленный массив, None автоматически преобразуется в NaN, вызывая dtype changed to ‘float64’ from ‘int64’
, и если вы видите серию, вы увидите «NaN» с индексом 0.
Теперь давайте посмотрим на серию строковых объектов и посмотрим на результат, введя None в серию:
import numpy as np ser1 = pd.Series(["one","two","three","four","five","six"], index=[1,2,3,4,5,6], name='Object_Series') print(ser1.dtype) --> Object ser1[1] = None print(ser1.dtype) --> Object ser1[2] = np.nan print(ser1.dtype) --> Object ser1 Output: 1 None 2 NaN 3 three 4 four 5 five 6 six Name: Object_Series, dtype: object
Поскольку String хранятся как объекты, нет преобразования из None в NaN или NaN в None.
В Series of float None, как и ожидалось, преобразуется в Nan:
Существует несколько способов ввести, обнаружить, удалить и использовать значения NaN/None в pandas, вы можете проверить это в другом посте.
Я попытался обобщить разницу между None и NaN в этом посте. Ваши мысли/отзывы о том же приветствуются для улучшения понимания того же самого.
Вы можете изучить Почему нам нужны отдельные индексаторы (loc/iloc) в Pandas:
Счастливого обучения!!!