Получение предупреждения SettingWithCopyWarning даже после использования.loc в панд [дубликат]

этот вопрос уже есть ответ здесь:

df_masked.loc[:, col] = df_masked.groupby([df_masked.index.month, df_masked.index.day])[col].\
            transform(lambda y: y.fillna(y.median()))

даже после использования .Лок,я понял. ошибка, как ее исправить?

Anaconda\lib\site-packages\pandas\core\indexing.py:476: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s

1 ответов


вы могли бы получить это UserWarning, если df_masked - это суб-таблицы данных другой таблицы данных. В частности, если бы данные были скопировал из исходного фрейма данных в df_masked затем панды испускает UserWarning, чтобы предупредить вас, что изменение df_masked не повлияет на исходный фрейм данных.

если вы не собираетесь изменять исходный фрейм данных, то вы можете игнорировать UserWarning.

есть способы отключить UserWarning на основе каждого оператора. В частности, вы можете использовать df_masked.is_copy = False.

если вы столкнетесь с этим UserWarning много, то вместо того, чтобы глушить UserWarnings один за другим, я думаю, что лучше оставить их, как вы разрабатываете свой код. Имейте в виду, что означает UserWarning, и если изменение-ребенка-не-влияет-на-родителя проблема не влияет на вас, а затем игнорировать его. Когда код готов к производству, или если вы достаточно опытны, чтобы не нужно предупреждения, полностью отключите их с помощью

pd.options.mode.chained_assignment = None

в верхней части вашего кода.


вот простой пример, который демонстрирует проблему и (в) решение:

import pandas as pd

df = pd.DataFrame({'swallow':['African','European'], 'cheese':['gouda', 'cheddar']})
df_masked = df.iloc[1:]
df_masked.is_copy = False   # comment-out this line to see the UserWarning
df_masked.loc[:, 'swallow'] = 'forest'

причина, почему UserWarning существует, чтобы помочь предупредить новых пользователей о том, что цепи индексации например

df.iloc[1:].loc[:, 'swallow'] = 'forest'

не повлияет df когда результат первого индексатора (например,df.iloc[1:]) возвращает копию.