Pandas SettingWithCopyWarning
Python 3.4 и Pandas 0.15.0
df - это датафрейм, а col1 - столбец. С кодом ниже я проверяю наличие значения 10 и заменяю такие значения на 1000.
df.col1[df.col1 == 10] = 1000
Вот еще один пример. На этот раз я изменяю значения в col2 на основе индекса.
df.col2[df.index == 151] = 500
Оба они выдают предупреждение ниже:
-c:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
В заключение,
cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].applymap(some_function)
Это создает аналогичное предупреждение с добавленным предложением:
Try using .loc[row_indexer,col_indexer] = value instead
Я не уверен, что понимаю обсуждение, указанное в предупреждениях. Как лучше написать эти три строки кода?
Обратите внимание, что операции работали.
2 ответа
Решение
Проблема здесь в том, что: df.col1[df.col1 == 10]
возвращает копию.
Так что я бы сказал:
row_index = df.col1 == 10
# then with the form .loc[row_indexer,col_indexer]
df.loc[row_index, 'col1'] = 100
Договорились с Полом об использовании 'loc'.
Для вашего случая применения карты вы должны сделать это:
cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)