Pandas НастройкаWithCopyWarning

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

Я не уверен, что я понимаю обсуждение, указанное в предупреждениях. Что было бы лучшим способом написать эти три строки кода?

Обратите внимание, что работа выполнена.

Ответ 1

Проблема в том, что: 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

Ответ 2

Согласился с Полом об использовании "loc".

Для вашего примера сложениями вы сможете это сделать:

cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)