2016-01-26 2 views
0

Я использую pandas 17.1. Работа с настройкойWithCopyWarning широко обсуждается в SO, но я не верю, что выглядит так: the most popular thread адресует мой случай использования, который присваивает скаляр столбцу.SettingWithCopy Предупреждение при назначении скаляра столбцу

Мой код:

df.loc[:, "some_col_name"] = 0 

Предположим, что столбец называется "some_col_name" уже существует; это не добавление столбца (если бы такой оператор даже мог).

Это генерирует настройкуWithCopyWarning, и для жизни меня я не могу понять, почему.

Он работает, когда я устанавливаю df.is_copy = False во-первых, но я бы предпочел избежать лишнего утверждения каждый раз, когда я это делаю, если это возможно.

Что я здесь делаю неправильно?

Спасибо!

Последующий ответ на ответ johnchase: df был создан оператором groupby (см. Ниже), поэтому я не уверен, где бы я добавил в .copy. Средство, о котором я упоминал, работает, но что я должен сделать это, для меня означает, что панды заставляют группы итераций не понимать, что они копии. (Они, правда, не так ли?)

for some_ix, df in bigger_df.groupby(cols_I_care_about): 
    df.loc[:, "some_col_name"] = 0 

ответ

1

Я думаю, что df является dataframe, который создается из ранее существующих dataframe. См. Следующее:

df_old = pd.DataFrame(data=np.arange(15).reshape(5, 3), columns=['a', 'b', 'c']) 
df = df_old[['a', 'c']] 
df.loc[:, 'c'] = 0 

В результате получается SettingWithCopyWarning. Следующий код кусок не приводят к получению SettingWithCopyWarning

df_old = pd.DataFrame(data=np.arange(15).reshape(5, 3), columns=['a', 'b', 'c']) 
df = df_old[['a', 'c']].copy() 
df.loc[:, 'c'] = 0 

панд предупреждает вас, что вы можете быть изменения исходного кадра данных. Вы можете использовать метод .copy(), чтобы убедиться, что вы создаете новый фреймворк и не изменяете оригинал, или df.is_copy = False, как и вы. Я бы не согласился с тем, что ваше решение - это компьютер, но предпочитает использовать .copy() при создании нового фреймворка данных, поскольку он менее подвержен ошибкам в будущем.

+0

Спасибо, @johnchase. Df создается группой с итератором/генератором. (Я никогда не могу вспомнить, что это такое, или второй является подмножеством первого.) Я пересмотрю код, чтобы показать это. Я бы подумал, что панды будут делать каждый полученный df, зная, что это уже копия. – HaPsantran

Смежные вопросы