Olá, Yves, tudo bem?
O SettingwithCopyWarning
é um tipo de warning em que o Pandas detecta que o usuário está fazendo uma alteração em um dado DataFrame e essa alteração refletirá também em um anterior.
Para ficar mais claro, supomos que o dataset
é nosso df1 e o s_dataset
é nosso df2 das imagens abaixo. Quando você faz apenas s_dataset = dataset[columns]
você cria apenas uma cópia rasa (visualização do dataframe - view), ou seja, quando algo é alterado em um, o outro se altera também e por isso levanta-se esse warning.
Como pode ser visto acima, o view df2(s_dataset
) à esquerda é apenas um subset do original df1(dataset
), diferentemente da cópia profunda a direita em que cria um objeto único df2(s_dataset
) separado do df1(dataset
). O caso à esquerda pode gerar problemas quando tentamos fazer alterações em um dos DataFrames, como podemos ver na imagem abaixo:
Se, por exemplo, quisermos modificar apenas o df1 ou o df2 o caso à esquerda não seria adequado e por isso, o warning é apresentado.
Mas, como queremos modificar apenas o s_dataset
(como na direita das imagens) é necessário fazer uma cópia profunda (copy) do dataframe original. Assim, existem algumas formas de se atingir o resultado esperado, duas delas são:
s_dataset = dataset[columns].copy()
Ou então, como sugerido no aviso, podemos utilizar o loc
:
s_dataset = dataset.loc[:, columns]
Assim, nosso código ficaria da seguinte maneira:
dataset = pd.read_csv('train.csv')
columns = ['LotArea','Street', 'MSZoning']
s_dataset = dataset.loc[:, columns]
# ou s_dataset = dataset[columns].copy()
answer = dataset.SalePrice
s_dataset['Street'] = s_dataset['Street'].map({'Pave':1, 'Grvl':2})
s_dataset
Com a saída da seguinte maneira:
LotArea Street MSZoning
0 8450 1 RL
1 9600 1 RL
2 11250 1 RL
3 9550 1 RL
4 14260 1 RL
... ... ... ...
1455 7917 1 RL
1456 13175 1 RL
1457 9042 1 RL
1458 9717 1 RL
1459 9937 1 RL
1460 rows × 3 columns
Para entender um pouco mais do warning e aprofundar-se nesse tipo de situação, deixarei na tabela abaixo as documentações que utilizamos para explicar estes comportamentos:
Qualquer dúvida é só chamar!
Forte abraço!