Панды: SettingWithCopyWarning

Я хотел бы заменить значения в PandasDataFrame больше произвольного числа (в данном случае 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?

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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 SettingWithCopyWarning

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Другие вопросы по тегам