Pandas: НастройкаWithCopyWarning

Я хотел бы заменить значения в Pandas DataFrame больше, чем произвольное число (в этом случае 100), с NaN (поскольку значения этого большого значения указывают на неудачный эксперимент). Раньше я использовал это для замены нежелательных значений:

sve2_all[sve2_all[' Hgtot ng/l'] > 100] = np.nan

Однако, я получил следующую ошибку:

-c:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
C:\Users\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\core\indexing.py:346: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s

Из этого вопроса в StackExchange кажется, что иногда это предупреждение можно игнорировать, но я не могу достаточно хорошо следить за обсуждением, чтобы убедиться, что это относится к моему ситуация. Является ли предупреждение в основном, давая мне знать, что я буду переписывать некоторые из значений в моем DataFrame?

Изменить: насколько я могу судить, все вел себя так, как должно. В качестве продолжения мой метод замены нестандартных значений? Есть ли лучший способ заменить значения?

Ответ 1

Как указано в сообщении об ошибке, вы должны использовать loc для этого:

sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan

Предупреждение здесь, чтобы остановить модификацию копии (здесь sve2_all[sve2_all[' Hgtot ng/l'] > 100] есть потенциально), и если это так, любые изменения не изменят исходный фрейм. Возможно, это работает правильно в некоторых случаях, но pandas не может гарантировать, что он будет работать во всех случаях... используйте на свой страх и риск (считайте себя предупрежденным!)).

Ответ 2

Я получал это предупреждение при попытке reset содержимого всего DataFrame, но не смог его решить, используя loc или iloc:

df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning

Но разрешение на ndarray, содержащееся в качестве данных, решает проблему:

df.values[:, :] = new_values # no warnings and desired behavior

Ответ 3

--- Проблема решена для меня ---

У меня была эта воюющая ошибка, когда я попытался преобразовать float → int, даже если я использовал команду ".loc". моя ошибка состояла в том, что я отфильтровал свой файл данных (с масками) до операции, поэтому преобразование произошло только в малой части элемента/столбца dataframe, результатом стал столбец смешанного типа, который создает конфузон. Я решил проблему путем преобразования кадра данных перед масками (фильтрация данных), надеюсь, что это поможет.

Ответ 4

Как это предлагают другие пользователи, вы можете попробовать:

myindex = sve2_all[' Hgtot ng/l'] > 100

sve2_all.loc[myindex, 'yourcolumn'] = np.nan

Имейте в виду, что если вы столкнулись с проблемами создания сводных таблиц (ключевое слово pivot_table row не поддерживается pandas 0.16.0 #417), вы должны использовать новый синтаксис индекса и столбцов вместо строк и столбцов. https://github.com/yhat/ggplot/issues/417

См. также:

Pandas НастройкаWithCopyWarning

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy