2012-06-01 11 views
5

Ho un po 'di problemi a modificare un DataFrame panda duplicato e non ho le modifiche valide per entrambi i duplicati e il DataFrame originale.DataFrame.apply in Python panda altera entrambi i DataFrames originali e duplicati

Ecco un esempio. Di 'creo un dataframe arbitrario da un elenco di dizionari:

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 

Poi ho assegnare la 'd' dataframe a 'e' variabile e applicare un po' di matematica arbitraria a colonna 'un' utilizzando applica:

In [70]: e = d 

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

il problema sorge in quanto la funzione di applicare si applica a quanto pare sia il duplicato dataframe 'e' e originale dataframe 'd', che non posso per la vita di me a capire:

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 

ho cercato b la documentazione di panda e Google per un motivo per cui sarebbe così, ma senza successo. Non riesco a capire cosa sta succedendo qui.

Ho anche provato le operazioni matematiche utilizzando un'operazione basata sull'elemento (ad es., e['a'] = [i + 1 for i in e['a']]), ma il problema persiste. C'è una stranezza nel tipo DataFrame panda di cui non sono a conoscenza? Apprezzo qualsiasi intuizione che qualcuno potrebbe essere in grado di offrire.

risposta

11

Questo non è un problema specifico per i panda. In Python, l'assegnazione non copia mai nulla:

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

Se si desidera una nuova dataframe, effettuare una copia con e = d.copy().

Modifica: Devo chiarire che l'assegnazione a un nome nudo non copia mai nulla. L'assegnazione a un articolo o attributo (ad es. a[1] = x o a.foo = bar) viene convertita in chiamate di metodo sotto il cofano e può eseguire la copia a seconda del tipo di oggetto a.

+0

E proprio quando pensavo di ottenere una presa decente su Python! Grazie mille per la risposta. Questo è un grande aiuto. – MikeGruz

+0

Perché doesnt b = a.copy() funziona? qual è il lavoro intorno .. – Merlin

+0

Non capisco cosa intendi con "perché non funziona". Funziona. Forse sei confuso dai nomi delle variabili? Ho detto 'e = d.copy()' perché quelli erano i nomi usati nella domanda originale. – BrenBarn

Problemi correlati