Как сказано выше, отсутствующие данные в pandas
представлены как NaN , где NaN - числовое значение, т.е. тип с плавающей запятой. Однако Нет является Python NoneType
, поэтому NaN не будет эквивалентно Нет .
In [27]: np.nan == None
Out[27]: False
В этом Github-поток они обсуждают далее, отмечая:
Это было сделано довольно давно, чтобы согласовать поведение нулей, поскольку они не сравниваются равными. Это ставит None и np.nan на равную (хотя и не совместимую с python, НО согласную с numpy) основу.
Это означает, что когда вы делаете df[df['label'] == None]
, вы идете elementwise
проверка, если np.nan == np.nan
, что, как мы знаем, ложно.
In [63]: np.nan == np.nan
Out[63]: False
Кроме того, вы не должны делать df[df['label'] == None]
, когда применяете Булево индексирование , используя ==
для NoneType
не является лучшей практикой, как PEP8 упоминает:
Сравнения с синглетами, такими как None, всегда должны выполняться с is
или is not
, а не с операторами равенства.
Например, вы можете сделать tst.value.apply(lambda x: x is None)
, что даст тот же результат, что и .isnull()
, иллюстрируя, как pandas
рассматривает их как NaN с. Примечание это для приведенного ниже примера tst
dataframe, где tst.value.dtypes
- это object
, из которых я явно указал элементы NoneType
.
В pandas
документах есть хороший пример , который иллюстрирует это и его эффект.
Например, если у вас есть два столбца, один из которых типа float
а другой object
вы можете увидеть, как панды хорошо справляются с типом None
, обратите внимание, что float
использует NaN .
In [32]: tst = pd.DataFrame({"label" : [1, 2, None, 3, None], "value" : ["A", "B", None, "C", None]})
Out[39]:
label value
0 1.0 A
1 2.0 B
2 NaN None
3 3.0 C
4 NaN None
In [51]: type(tst.value[2])
Out[51]: NoneType
In [52]: type(tst.label[2])
Out[52]: numpy.float64
Этот пост объясняет разницу между NaN и Нет очень хорошо , определенно взглянем на это.