Панды: SettingWithCopyWarning
Я хотел бы заменить значения в 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
?
Редактировать: Насколько я могу судить, все вело себя как надо. В качестве продолжения мой метод замены значений нестандартен? Есть ли лучший способ заменить значения?
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
Смотрите также: