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