Как значения в моем фрейме данных могут быть NaN и плавающими одновременно - PullRequest
2 голосов
/ 21 сентября 2019

Я пытаюсь запустить PCA из sklearn, и я продолжаю получать ValueError: Input contains NaN, infinity or a value too large for dtype('float64').Это удивляет меня, так как я использовал df.dropna() и len(df) изменился с 4096 до 1566 после использования drop.na().

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

df_test = pd.DataFrame([[0.11, 0.22],[1.11, 1.22]], columns=['s1', 's2'])

когда я делаю

df_test[df_test.isna()]

я получаю:

  s1  s2
0 NaN NaN
1 NaN NaN

и когда:

df_test[~df_test.isna()]

я получаю:

   s1    s2
0  0.11  0.22
1  1.11  1.22

то, что я ожидаю от

df_test[df_test.isna()]

:

s1  s2

без строк.Как значения в моих ячейках могут быть допустимыми float64 и NaN одновременно, это довольно запутанно ...

UDPATE: Оказывается, NaN не были проблемой при запуске PCA, но на самом деле 2 бесконечных значения попали вмои данные, и я не обнаружил их в моем кадре данных 4096 x 15, пока не понял, что NaN обрабатывались правильно все время.Спасибо всем, что ответили!

1 Ответ

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

Когда вы df_test.isna(), он создает логическую маску.

>>> df_test.isna()
      s1     s2
0  False  False
1  False  False

Теперь, когда вы делаете фильтр с использованием этой маски, он возвращает NaN.

>>> df_test[df_test.isna()]
   s1  s2
0 NaN NaN
1 NaN NaN

Если вы не хотите NaN, просто бросьте их.

Параметр how определяет, удаляется ли строка или столбец из DataFrame, когда у нас есть хотя бы один NA или все NA.

'any': если какие-либо значения NA равнынастоящее время, опустите эту строку или столбец.

'all': если все значения равны NA, удалите эту строку или столбец.

>>> df_test[df_test.isna()].dropna(how='all') # Depends on the situation
Empty DataFrame
Columns: [s1, s2]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...