SettingWithCopyWarning, даже при использовании loc (?)
Я получаю ошибки SettingWithCopyWarning
в тех случаях, когда я их не ожидал:
N.In <38>: # Column B does not exist yet
N.In <39>: df['B'] = df['A']/25
N.In <40>: df['B'] = df['A']/50
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: 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
и
N.In <41>: df.loc[:,'B'] = df['A']/50
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: 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
Почему это происходит в случае 1 и 2?
Ответы
Ответ 1
В случае 1, df['A']
создает копию df
. Как объясняется Pandas документацией, это может привести к неожиданным результатам при цепочке, поэтому возникает предупреждение. Случай 2 выглядит правильно, но возможны ложные срабатывания:
Предупреждение. Привязанные предупреждения/исключения назначаются для сообщите пользователю о возможном недопустимом назначении. Может быть ложь позитивы; ситуации, когда цепляемое присваивание непреднамеренно сообщается.
Чтобы отключить SettingWithCopyWarning
для одного кадра данных, используйте
df.is_copy = False
Чтобы отключить прикованные предупреждения о назначении, используйте
options.mode.chained_assignment = None
Ответ 2
Другое решение, которое должно подавлять предупреждение:
df = df.copy()
df['B'] = df['A']/25
df['B'] = df['A']/50