Разница между ответами с использованием .isna и (df == np.nan) .sum (). sum () - PullRequest
1 голос
/ 29 сентября 2019

После применения df.fillna(df.mean()) для удаления значений Nan я получаю другой результат с df.isna().sum().sum() и (df==np.nan).sum().sum()

с (df==np.nan).sum().sum() Я получаю 0, но с df.isna().sum().sum() я получаю 33470

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

isna() метод обнаруживает пропущенные значения, тогда как когда мы делаем df==np.nan, это всегда возвращает false, поскольку при сравнении np.nan == np.nan результат всегда равен False.

Пример:

>>> np.nan == np.nan
    False

>>> df = pandas.DataFrame(data={'col1': [1, np.nan], 'col2': [3, 4]})
>>> df
    col1    col2
  0  1.0       3
  1  NaN       4


>>> df.isnull().sum().sum()
    1

>>> (df==np.nan).sum().sum()
    0
0 голосов
/ 29 сентября 2019

Проблема в том, что NaN не равно NaN.Строго говоря, отношение равенства числа с плавающей запятой не является отношением эквивалентности , поскольку оно не является полностью рефлексивным .

ДействительноНапример, если мы сравним np.nan с np.nan, то получим:

>>> np.nan == np.nan
False

Это главная причина, по которой .isna() существует в первую очередь.

Если мыНапример, создайте фрейм данных, который состоит только из NaN s, мы видим, что df.isna() и df == np.nan дают разные ответы:

>>> df = pd.DataFrame({'a': [np.nan]*5, 'b': [np.nan]*5})
>>> df
    a   b
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
>>> df.isna()
      a     b
0  True  True
1  True  True
2  True  True
3  True  True
4  True  True
>>> df == np.nan
       a      b
0  False  False
1  False  False
2  False  False
3  False  False
4  False  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...