Como corrigir no pandas: settingwithcopywarning


Um aviso que você pode encontrar ao usar pandas é:

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

Este aviso aparece quando os pandas encontram algo chamado atribuição em cadeia – a combinação de encadeamento e atribuição em uma única etapa.

É importante observar que isso é apenas um aviso e não um erro. Seu código continuará em execução, mas os resultados nem sempre serão os esperados.

A maneira mais fácil de suprimir esse aviso é usar o seguinte trecho de código:

 p.d. options . fashion . chained_assignment = None

O exemplo a seguir mostra como responder a esse aviso na prática.

Como reproduzir o aviso

Suponha que criemos o seguinte DataFrame do pandas:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

Agora suponha que criemos um novo DataFrame que contenha apenas a coluna “A” do DataFrame original e dividamos cada valor na coluna “A” por 2:

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Recebemos a mensagem SettingWithCopyWarning porque estamos definindo novos valores para a coluna “A” em uma “fatia” do DataFrame original.

No entanto, se olharmos para o novo DataFrame que criamos, veremos que cada valor foi dividido com sucesso por 2:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Embora tenhamos recebido uma mensagem de aviso, os pandas ainda fizeram o que pensávamos que fariam.

Como evitar o aviso

Para evitar esse aviso, é recomendado usar a sintaxe .loc[row indexer, col indexer] da seguinte forma:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

O novo DataFrame contém todos os valores da coluna “A” do DataFrame original, divididos por dois, e nenhuma mensagem de aviso aparece.

Se quisermos evitar que a mensagem de aviso seja exibida, podemos usar o seguinte trecho de código:

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

Para obter uma explicação detalhada de por que a atribuição de cadeia deve ser evitada, consulte a documentação on-line do pandas .

Recursos adicionais

Como corrigir: Nenhum módulo chamado pandas
Como corrigir: nenhum módulo chamado numpy
Como corrigir: as colunas se sobrepõem, mas nenhum sufixo é especificado

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *