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