2014-10-30 2 views
2

У меня очень простая проблема. Я хотел бы изменить значение в данном столбце данной строки кадра данных pandas. Я пытаюсь сделать это следующим образом:Как изменить значение в одной «ячейке» кадра данных pandas?

df['column3'].loc[this_date] = val 

В результате я получаю следующее предупреждение:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 

Моя интерпретация этого предупреждения является то, что с помощью имени колонок ('column3') и loc I на самом деле не обращайтесь к соответствующей ячейке фрейма данных (см.). Вместо этого я создаю объект, который является копией объекта «cell», а затем я пытаюсь изменить значение, связанное с этим «экземпляром-копией».

Что я не понимаю, так это то, что он работает. Несмотря на то, что панды пишут мне, что я пытаюсь изменить копию, я изменяю исходный фрейм данных.

Мой вопрос: как убедиться, что я действительно делаю то, что я хотел бы сделать, и как это сделать «правильно», чтобы панды не жаловались?

+1

Не должно быть 'df.loc [this_date,«колонка3»] = значение '? Ваша версия отличается от документов: http://pandas.pydata.org/pandas-docs/stable/indexing.html – EdChum

+1

Тот факт, что он работает, случайный, он может не работать, поэтому вы получаете предупреждение, пожалуйста, попробуйте мой предыдущий комментарий, не должно быть предупреждения – EdChum

ответ

1

Причиной получения предупреждения является то, что df сам является копией какого-либо другого объекта dataframe. Я предполагаю, что у вас есть исходный dataframe df_origin. И вы получаете df от df_origin от некоторой операции, такой как нарезка. Таким образом, df является копией df_origin. Затем вы пытаетесь установить какое-то значение в df, предупреждает, чтобы вы сказали, что это не изменит значение в df_origin. Одним из решений является использование одной переменной, указывающей на объект dataframe до и после нарезки, если вы не заботитесь о df_origin. В противном случае вы можете подавить предупреждение, pd.set_option('mode.chained_assignment', None)

Ваш путь установки значения в порядке, наряду со следующими из них:

df.ix[this_date, 'column3] = val 
df.loc[this_date, 'column3'] = val 
df.at[this_date, 'column3'] = val 
+0

предупреждение показано, потому что цепочка индексирования не в порядке! это зависит от базовых данных (независимо от того, является ли это s view), и если он смешанный dtype. Если это условия, то вы будете устанавливать копию, следовательно, предупреждение. Причина, по которой не нужно индексировать цепочку EVER, заключается в том, что нет гарантии, что ваши настройки будут работать! существует множество других параметров индексирования. – Jeff