Я работаю на 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:



Счастливого обучения!!!