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