Al seleccionar un subtrama de datos de un marco de datos primario, noté que algunos programadores hacen una copia del marco de datos utilizando el .copy()
método. Por ejemplo,
X = my_dataframe[features_list].copy()
... en lugar de solo
X = my_dataframe[features_list]
¿Por qué están haciendo una copia del marco de datos? ¿Qué pasará si no hago una copia?
python
pandas
chained-assignment
Elizabeth Susan Joseph
fuente
fuente
Respuestas:
Esto se expande en la respuesta de Paul. En Pandas, la indexación de un DataFrame devuelve una referencia al DataFrame inicial. Por lo tanto, cambiar el subconjunto cambiará el DataFrame inicial. Por lo tanto, querrá usar la copia si desea asegurarse de que el DataFrame inicial no cambie. Considere el siguiente código:
Obtendrás:
En contraste, lo siguiente deja df sin cambios:
fuente
Porque si no hace una copia, los índices pueden manipularse en otro lugar, incluso si asigna el dataFrame a un nombre diferente.
Por ejemplo:
func1 puede modificar df modificando df2, para evitar eso:
fuente
, both variables reference the same DataFrame instance. So any changes made to
df` odf2
se realizará en la misma instancia de objeto. Mientras que en ladf2 = df.copy()
segunda instancia de objeto se crea, una copia de la primera, pero ahoradf
y unadf2
referencia a diferentes instancias de objeto y cualquier cambio se realizará en su respectiva instancia de DataFrame.Es necesario mencionar que devolver la copia o la vista depende del tipo de indexación.
La documentación de los pandas dice:
fuente
El objetivo principal es evitar la indexación encadenada y eliminar el
SettingWithCopyWarning
.Aquí la indexación encadenada es algo así como
dfc['A'][0] = 111
El documento dice que se debe evitar la indexación encadenada al devolver una vista versus una copia . Aquí hay un ejemplo ligeramente modificado de ese documento:
Aquí
aColumn
hay una vista y no una copia del DataFrame original, por lo que modificarlo también modificaráaColumn
el originaldfc
. A continuación, si indexamos la fila primero:Esta vez
zero_row
es una copia, por lo que el originaldfc
no se modifica.De estos dos ejemplos anteriores, vemos que es ambiguo si desea o no cambiar el DataFrame original. Esto es especialmente peligroso si escribe algo como lo siguiente:
Esta vez no funcionó en absoluto. Aquí queríamos cambiar
dfc
, pero en realidad modificamos un valor intermediodfc.loc[0]
que es una copia y se descarta de inmediato. Es muy difícil predecir si el valor intermedio le gustadfc.loc[0]
odfc['A']
es una vista o una copia, por lo que no se garantiza si se actualizará DataFrame original o no. Es por eso que se debe evitar la indexación encadenada, y los pandas generan laSettingWithCopyWarning
actualización para este tipo de indexación encadenada.Ahora es el uso de
.copy()
. Para eliminar la advertencia, haga una copia para expresar su intención explícitamente:Como está modificando una copia, sabe que el original
dfc
nunca cambiará y no espera que cambie. Su expectativa coincide con el comportamiento, luegoSettingWithCopyWarning
desaparece.Tenga en cuenta que si desea modificar el DataFrame original, el documento sugiere que utilice
loc
:fuente
En general, es más seguro trabajar en copias que en marcos de datos originales, excepto cuando sabe que ya no necesitará el original y desea continuar con la versión manipulada. Normalmente, aún tendría algún uso para que el marco de datos original se compare con la versión manipulada, etc. Por lo tanto, la mayoría de las personas trabajan en copias y se fusionan al final.
fuente
Supongo que tiene el marco de datos como se muestra a continuación
Cuando desee crear otro
df2
que sea idéntico adf1
, sincopy
Y quisiera modificar el valor de df2 solo de la siguiente manera
Al mismo tiempo, también se cambia el df1
Dado que dos df son iguales
object
, podemos verificarlo usando elid
Entonces, como un mismo objeto y uno cambia a otro, también pasará el mismo valor.
Si agregamos el
copy
, y ahoradf1
ydf2
se consideran diferentesobject
, si hacemos el mismo cambio en uno de ellos, el otro no cambiará.Es bueno mencionar que cuando se configura el marco de datos original, también es seguro agregar la copia para evitar
SettingWithCopyWarning
fuente