SettingWithCopyWarning Python pandas

publicado por: Anonymous

tengo una consulta, quiero agregar una columna en un DataFrame de la siguiente manera:

df["nueva columna"] = 0

>>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

Sin embargo al crear una columna de la siguiente manera:

df = df.assign(nueva_columna = 0)

no arroja ningun warning, pero no me deja ponerle espacio al nombre de la columna
Mi pregunta es ¿por qué me lanza la advertencia?, siempre creo las columnas de la primera forma.

solución

Creo que el problema viene de que esa columna ya existía en tu DataFrame.

Cuando la columna ya existe, al hacer df["nueva columna"] obtienes una referencia a la columna en cuestión, a la que puedes asignar perfectamente el valor 0 (que pandas repetirá el número de veces necesario para rellenar con ceros la columna completa). Pero el problema es que tal vez, bajo condiciones muy difíciles de prever, df["nueva columna"] no te dé una referencia a la columna, sino una copia de la columna. En ese caso la asignación de ceros la harías sobre la copia en lugar de sobre la columna real, y eso es lo que te dice el aviso.

El método con df.assign() no tiene ese problema, pues actúa siempre sobre una referencia a la columna, ya sea para crear una nueva o para sustituir lo que ya había en ella si existía previamente.

No obstante, no es esa la única solución. El propio warning te está diciendo cómo deberías hacerlo, y es usando la propiedad .loc, del dataframe, la cual siempre te permitirá acceder a referencias de las columnas y nunca a copias.

La propiedad .loc[] espera dos índices entre los corchetes, separados por una coma. El primero se refiere a la fila y el segundo a la columna. Cualquiera de los dos puede ser un rango, por lo que te permite en el fondo hacer una selección rectangular de tu dataframe.

En tu caso, para seleccionar una columna completa, puedes poner : en la parte de las filas. Por tanto:

df.loc[:, "nueva columna"] = 0

Eso creará la columna nueva si no existía, es decir hace lo mismo que tú intentabas, pero evitará el warning.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *