2012-06-01 13 views
5

Tengo problemas para alterar un DataFrame de panda duplicado y no tengo las modificaciones aplicadas tanto al como al duplicado del DataFrame original.DataFrame.apply in python pandas altera tanto DataFrames originales como duplicados

Aquí hay un ejemplo. Digo creo una trama de datos arbitraria de una lista de diccionarios:

In [67]: d = [{'a':3, 'b':5}, {'a':1, 'b':1}] 

In [68]: d = DataFrame(d) 

In [69]: d 

Out[69]: 
    a b 
0 3 5 
1 1 1 

Entonces asignar la 'd' trama de datos a 'e' variable y se aplica un poco de matemática arbitraria a la columna 'a' usando aplicar:

In [70]: e = d 

In [71]: e['a'] = e['a'].apply(lambda x: x + 1) 

el problema surge porque la función de aplicar al parecer se aplica tanto a la trama de datos duplicada 'e' y original trama de datos 'd', que yo no puedo por la vida de a averiguar:

In [72]: e # duplicate DataFrame 
Out[72]: 
    a b 
0 4 5 
1 2 1 

In [73]: d # original DataFrame, notice the alterations to frame 'e' were also applied 
Out[73]: 
    a b 
0 4 5 
1 2 1 

he buscado b oth la documentación de pandas y Google por una razón por la que esto sería así, pero fue en vano. No puedo entender lo que está pasando aquí en absoluto.

También he intentado las operaciones matemáticas usando una operación de elemento (por ejemplo, e['a'] = [i + 1 for i in e['a']]), pero el problema persiste. ¿Hay alguna peculiaridad en el tipo de Dataframe de pandas de la que no tengo conocimiento? Aprecio cualquier idea que alguien pueda ofrecer.

Respuesta

11

Esto no es un problema específico de pandas. En Python, nunca copia de asignación cualquier cosa:

>>> a = [1,2,3] 
>>> b = a 
>>> b[0] = 'WHOA!' 
>>> a 
['WHOA!', 2, 3] 

Si desea una nueva trama de datos, haga una copia con e = d.copy().

Editar: Debería aclarar que la asignación a un nombre simple nunca copia nada. La asignación a un elemento o atributo (por ejemplo, a[1] = x o a.foo = bar) se convierte en llamadas a métodos bajo el capó y puede copiarse según el tipo de objeto a.

+0

¡Y justo cuando pensaba que estaba teniendo un buen agarre en Python! Muchas gracias por la respuesta. Eso es una gran ayuda. – MikeGruz

+0

¿Por qué no funciona b = a.copy()? ¿cuál es el trabajo alrededor .. – Merlin

+0

No entiendo lo que quiere decir con "por qué no funciona". Funciona. Tal vez estás confundido por los nombres de las variables? Dije 'e = d.copy()' porque esos eran los nombres usados ​​en la pregunta original. – BrenBarn

Cuestiones relacionadas