Solución:
La diferencia se refiere a si desea modificar un marco existente, o crear un nuevo marco manteniendo el marco original como estaba.
En particular, DataFrame.assign
te devuelve un nuevo objeto que tiene una copia de los datos originales con los cambios solicitados … el marco original permanece sin cambios.
En tu caso particular:
>>> df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
Ahora suponga que desea crear un nuevo marco en el que A
Está en todas partes 1
sin destruir df
. Entonces podrías usar .assign
>>> new_df = df.assign(A=1)
Si no desea mantener los valores originales, entonces claramente df["A"] = 1
será más apropiado. Esto también explica la diferencia de velocidad, por necesidad .assign
debe copiar los datos mientras [...]
no.
La premisa en assign
es que vuelve:
Un nuevo DataFrame con las nuevas columnas además de todas las columnas existentes.
Y tampoco puede hacer nada en el lugar para cambiar el marco de datos original.
El invocable no debe cambiar el DataFrame de entrada (aunque los pandas no lo verifican).
Por otra parte df['ln_A'] = np.log(df['A'])
hará las cosas en su lugar.
Entonces, ¿hay alguna razón por la que debería dejar de usar mi método anterior en favor de
df.assign
?
Creo que puedes intentar df.assign
pero si lo haces cosas intensivas en memoria, mejor trabajar lo que hiciste antes u operaciones con inplace=True
.