Cómo arreglar SettingWithCopyWarning en Pandas

El SettingWithCopyWarning puede ocurrir cuando intentamos modificar los datos en Pandas DataFrame. Esta advertencia se lanza cuando escribimos una línea de código con operaciones get y set. 

Para explicar esto en detalle, al usar la operación de obtención, Pandas no garantizará que el resultado devuelto de la operación de obtención sea Ver o Copiar. Si devolviera una vista, la operación de configuración afectaría al DataFrame original. Si devolviera una copia, modificaría la copia pero el DataFrame original permanece sin cambios. Entonces, aquí no estamos seguros de si los cambios ocurrieron en DataFrame o no.

Marco de datos

Nombre del estudiante

Porcentaje

Calificación

Akhil

Sai

sesenta y cinco

C

Rohit

90

O

prasanth

79

B

Divya

89

A

Código que arroja una advertencia 

Python3

# import necessary packages
import pandas as pd
 
# create a dataframe
marks = pd.DataFrame({'Name': ['Akhil', 'Sai', 'Rohit', 'Prasanth', 'Divya'],
                      'Percentage': ['-', 65, 90, 79, 89],
                      'Grade': ['-', 'C', 'O', 'B', 'A']})
 
# Assign Absent if percentage is not specified
marks[marks.Percentage == '-'].Grade = 'Ab'

Producción

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py:5303: Configuración con advertencia de copia: 

Se está intentando establecer un valor en una copia de un segmento de un DataFrame.

Intente usar .loc[row_indexer,col_indexer] = valor en su lugar

Consulte las advertencias en la documentación: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  self[nombre] = valor

Solución

Para resolver este problema en lugar de dividir mientras obtiene los datos requeridos, use el método loc para obtener las filas y columnas requeridas. Y también use el método de copia para almacenar una copia de DataFrame en otra variable de modo que podamos separar la operación de obtención y configuración en 2 líneas.

Ejemplo 1:

Use el método anterior DataFrame y loc mientras obtiene las filas y columnas requeridas para obtener una operación.

Python3

# import necessary packages
import pandas as pd
 
# create a dataframe
marks = pd.DataFrame({'Name': ['Akhil', 'Sai', 'Rohit', 'Prasanth', 'Divya'],
                      'Percentage': ['-', 65, 90, 79, 89],
                      'Grade': ['-', 'C', 'O', 'B', 'A']})
 
# Assign Absent if percentage is not specified
marks.loc[marks.Percentage == '-', 'Grade'] = 'Ab'
 
# modified content
marks

Producción

Explicación : en lugar de cortar, lo que arroja una advertencia, aquí usamos el método loc.

Nota : Pero este método loc no garantiza el 100 % de la salida sin advertencias . Por lo tanto, se recomienda crear una copia del marco de datos original y modificarlo.

Ejemplo 2:

Cree una copia de un DataFrame y realice cambios en él utilizando los métodos de ubicación y copia.

Python3

# import necessary packages
import pandas as pd
 
# create a dataframe
marks = pd.DataFrame({'Name': ['Akhil', 'Sai', 'Rohit', 'Prasanth', 'Divya'],
                      'Percentage': ['-', '-', 90, 79, 89],
                      'Grade': ['-', '-', 'O', 'B', 'A']})
 
# create a copy of original DataFrame whose
$ percentage is empty(absenties)
Absent_Students = marks.loc[marks.Percentage == '-', :].copy()
 
# Make their grade as 'Ab' which indicates absent.
Absent_Students.Grade = 'Ab'
 
# modified content
Absent_Students

Producción

Explicación : los Absent_Students anteriores son una copia del DataFrame original con solo estudiantes ausentes. Asegura que estamos cambiando modificaciones solo en la copia de un DataFrame. Por lo tanto, elimina la confusión entre ver y copiar.

Publicación traducida automáticamente

Artículo escrito por akhilvasabhaktula03 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *