Pandas DataFrame: SettingWithCopyWarning: se está intentando establecer un valor en una copia de un segmento desde un DataFrame

Sé que hay toneladas de publicaciones sobre esta advertencia, pero no pude encontrar una solución a mi situación. Aquí está mi código:

df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int) #df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int).copy() #df.loc[:, 'my_col'] = df['my_col'].astype(int) 

Produce la advertencia:

SettingWithCopyWarning: un valor está intentando establecerse en una copia de un sector desde un DataFrame. Intente usar .loc [row_indexer, col_indexer] = value en su lugar

A pesar de que cambié el código según lo sugerido, ¿todavía recibo esta advertencia? Todo lo que necesito hacer es convertir el tipo de datos de una columna.

** Observación: ** Originalmente, la columna es de tipo float con un decimal (ejemplo: 4711.0). Por lo tanto, lo cambio a entero (4711) y luego a cadena (‘4711’) – solo para eliminar el decimal.

¡Aprecio tu ayuda!

Actualización: la advertencia fue un efecto secundario en el filtrado de los datos originales que se realizó justo antes. Me faltaba el DataFrame.copy (). Usando la copia en su lugar, solucionó el problema!

 df = df[df['my_col'].notnull()].copy() df.loc[:, 'my_col'] = df['my_col'].astype(int).astype(str) #df['my_col'] = df['my_col'].astype(int).astype(str) # works too! 

Creo que necesito copy y omitir loc para seleccionar columnas:

 df = df[df['my_col'].notnull()].copy() df['my_col'] = df['my_col'].astype(int).astype(str) 

Explicación :

Si modifica los valores en df más adelante, encontrará que las modificaciones no se propagan a los datos originales ( df ) y que Pandas hace una advertencia.

Otra forma es deshabilitar las asignaciones encadenadas, que funcionan en su código sin la necesidad de crear una copia :

 # disable chained assignments pd.options.mode.chained_assignment = None 

Si necesita cambiar el tipo de datos de una sola columna, es más fácil direccionar esa columna directamente:

 df['my_col'] = df['my_col'].astype(int) 

O utilizando .assign :

 df = df.assign(my_col=lambda d: d['my_col'].astype(int)) 

El .assign es útil si solo necesita la conversión una vez, y no desea modificar su df fuera de ese scope.