df.loc вызывает предупреждающее сообщение SettingWithCopyWarning

Следующая строка моего кода вызывает предупреждение:

import pandas as pd

s = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
s.loc[-1] = [5,np.nan,np.nan,6]
grouped = s.groupby(['A'])
for key_m, group_m in grouped:
    group_m.loc[-1] = [10,np.nan,np.nan,10]

C:\Anaconda3\lib\site-packages\ipykernel\__main__.py:10: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

Согласно документации это рекомендуемый способ, так что же происходит?

Спасибо за вашу помощь.

1 ответ

Решение

Документация немного сбивает с толку.

Ваш dataframe это копия другого dataframe, Вы можете проверить это, запустив bool(df.is_copy) Вы получаете предупреждение, потому что пытаетесь присвоить эту копию.

Предупреждение / документация говорит вам, как вы должны были построить df на первом месте. Не так, как вы должны назначить ему сейчас, когда это копия.

df = some_other_df[cols]

сделаю df копия some_other_df, Предупреждение предлагает сделать это вместо

df = some_other_df.loc[:, [cols]]

Теперь, когда это сделано, если вы решите игнорировать это предупреждение, вы можете

df = df.copy()

или же

df.is_copy = None
Другие вопросы по тегам