Podría alguien explicarme la diferencia entre

df2 = df1

df2 = df1.copy()

df3 = df1.copy(deep=False)

He probado todas las opciones y lo hizo de la siguiente manera:

df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1 = pd.DataFrame([9,9,9])

y devuelve como sigue:

df1: [9,9,9]
df2: [1,2,3,4,5]
df3: [1,2,3,4,5]
df4: [1,2,3,4,5]

Así, observo ninguna diferencia en el resultado entre .copy() y .copy(deep=False). Por qué?

Yo esperaría que una de las opciones ‘=’, copy(), copiar(profundidad=False) para volver [9,9,9]

Lo que me estoy perdiendo por favor?

InformationsquelleAutor szerszen | 2017-09-20

3 Comentarios

  1. 16

    Si usted ve el Id de objeto de los diversos DataFrames de crear, se puede ver claramente lo que está sucediendo.

    Al escribir df2 = df1, se crea una variable llamada df2, y la unión con un objeto con id 4541269200. Cuando usted escribe df1 = pd.DataFrame([9,9,9]), se crea un nueva objeto con el identificador 4541271120 y vinculante para la variable df1, pero el objeto con id 4541269200 que anteriormente fue obligado a df1 sigue vivo. Si no hay variables enlazado a ese objeto, se puede obtener de la basura recolectada por Python.

    In[33]: import pandas as pd
    In[34]: df1 = pd.DataFrame([1,2,3,4,5])
    In[35]: id(df1)
    Out[35]: 4541269200
    
    In[36]: df2 = df1
    In[37]: id(df2)
    Out[37]: 4541269200  # Same id as df1
    
    In[38]: df3 = df1.copy()
    In[39]: id(df3)
    Out[39]: 4541269584  # New object, new id.
    
    In[40]: df4 = df1.copy(deep=False)
    In[41]: id(df4)
    Out[41]: 4541269072  # New object, new id.
    
    In[42]: df1 = pd.DataFrame([9, 9, 9])
    In[43]: id(df1)
    Out[43]: 4541271120  # New object created and bound to name 'df1'.
    
    In[44]: id(df2)
    Out[44]: 4541269200  # Old object's id not impacted.

    Edit: Añadido el 7/30/2018

    Profundo copia no funciona en los pandas y los devs considere la posibilidad de colocar los objetos mutables en el interior de un DataFrame como un antipattern. Considere lo siguiente:

    In[10]: arr1 = [1, 2, 3]
    In[11]: arr2 = [1, 2, 3, 4]
    In[12]: df1 = pd.DataFrame([[arr1], [arr2]], columns=['A'])
    In[13]: df1.applymap(id)
    Out[13]: 
                A
    0  4515714832
    1  4515734952
    
    In[14]: df2 = df1.copy(deep=True)
    In[15]: df2.applymap(id)
    Out[15]: 
                A
    0  4515714832
    1  4515734952
    
    In[16]: df2.loc[0, 'A'].append(55)
    In[17]: df2
    Out[17]: 
                   A
    0  [1, 2, 3, 55]
    1   [1, 2, 3, 4]
    In[18]: df1
    Out[18]: 
                   A
    0  [1, 2, 3, 55]
    1   [1, 2, 3, 4]

    df2, si se trataba de una verdadera y profunda copia debería haber tenido nuevos identificadores de las listas contenidas en ella. Como resultado, cuando se modifica una lista dentro de df2, que afecta a la lista dentro de df1 así, porque son los mismos objetos.

    • Hola! Pero ¿cuál es la diferencia entre df1.copia() y df1.copia(profundidad=False) ? Se puede mejorar el ejemplo para mostrar esta diferencia?
    • Esto es útil, ya que ahora veo que la diferencia entre df2 = df1 y df2 = df1.copy(deep=False); crea un nuevo objeto con un nuevo id. Pero todavía no entiendo por qué es importante? Son todavía sólo referencias a df1, ¿verdad? Ellos tendrán la recolección de la misma manera, ¿verdad? O, ¿la copia superficial en realidad crear un nuevo contenedor de objeto, salvo que todos los elementos son, de hecho, que apunta a la misma referencia? Si es así, que parece el peor de todos los mundos: consume la mayor parte de la memoria (millones de duplicados de punteros), pero todavía no tiene una copia auténtica.
    • He añadido un ejemplo para ilustrar cómo profundo copia no funciona en pandas como usted se lo espera.
  2. 3

    Copia profunda crea un nuevo id de cada objeto que contiene mientras copia normal sólo copia los elementos de la matriz y crea un nuevo identificador de una variable a la que se copiará.

    La razón por la que ninguno de df2, df3 y df4 mostrar [9,9,9] es:

    In[33]: import pandas as pd
    In[34]: df1 = pd.DataFrame([1,2,3,4,5])
    In[35]: id(df1)
    Out[35]: 4541269200
    
    In[36]: df2 = df1
    In[37]: id(df2)
    Out[37]: 4541269200  # Same id as df1
    
    In[38]: df3 = df1.copy()
    In[39]: id(df3)
    Out[39]: 4541269584  # New object, new id.
    
    In[40]: df4 = df1.copy(deep=False)
    In[41]: id(df4)
    Out[41]: 4541269072  # New object, new id.
    
    In[42]: df1 = pd.DataFrame([9, 9, 9])
    In[43]: id(df1)
    Out[43]: 4541271120  # New object created and bound to name 'df1'.
  3. 0

    Necesita modificar df elementos de forma individual. Pruebe las siguientes

    df1 = pd.DataFrame([1,2,3,4,5])
    df2 = df1
    df3 = df1.copy()
    df4 = df1.copy(deep=False)
    
    df1.iloc[0,0] = 6
    df2.iloc[1,0] = 7
    df4.iloc[2,0] = 8
    
    print(df1)
    print(df2)
    print(df3)
    print(df4)

Dejar respuesta

Please enter your comment!
Please enter your name here