Почему pandas isnull () работает, но == Ни один не работает? - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь выбрать строки df, где столбец label имеет значение None. (Это значение None, полученное из другой функции, а не NaN)

Почему df[df['label'].isnull()] возвращает нужные мне строки,

, но df[df['label'] == None] возвращает Empty DataFrame Columns: [path, fanId, label, gain, order] Index: []?

1 Ответ

3 голосов
/ 02 октября 2019

Как сказано выше, отсутствующие данные в 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 и Нет очень хорошо , определенно взглянем на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...