2013-07-11 10 views
20

In primo luogo, creare un dataframeIn panda, posso copiare a fondo un DataFrame incluso il suo indice e la sua colonna?

In [61]: import pandas as pd 
In [62]: df = pd.DataFrame([[1], [2], [3]]) 

Poi, ho profondamente copio da copy

In [63]: df2 = df.copy(deep=True) 

Ora il DataFrame sono diversi.

In [64]: id(df), id(df2) 
Out[64]: (4385185040, 4385183312) 

Tuttavia, il index sono sempre gli stessi.

In [65]: id(df.index), id(df2.index) 
Out[65]: (4385175264, 4385175264) 

Stessa cosa accadrà in colonne, c'è un modo che io possa facilmente profondamente copiarlo non solo i valori, ma anche indice e colonne?

+3

'profonda = true' è il default btw – JohnE

risposta

11

Mi chiedo se si tratta di un bug nei panda ... è interessante perché Index/MultiIndex (indice e colonne) sono in un certo senso supposed to be immutable (tuttavia penso che dovrebbero essere copie).

Per ora, è facile creare il proprio metodo, e aggiungerlo alla dataframe:

In [11]: def very_deep_copy(self): 
    return pd.DataFrame(self.values.copy(), self.index.copy(), self.columns.copy()) 

In [12]: pd.DataFrame.very_deep_copy = very_deep_copy 

In [13]: df2 = df.very_deep_copy() 

Come si può vedere questo creerà nuovi oggetti (e preservare nomi):

In [14]: id(df.columns) 
Out[14]: 4370636624 

In [15]: id(df2.columns) 
Out[15]: 4372118776 
+4

Cre problema con github: https://github.com/pydata/pandas/issues/4202 –

22

ultima versione di Panda non ha questo problema più

import pandas as pd 
    df = pd.DataFrame([[1], [2], [3]]) 

    df2 = df.copy(deep=True) 

    id(df), id(df2) 
    Out[3]: (136575472, 127792400) 

    id(df.index), id(df2.index) 
    Out[4]: (145820144, 127657008) 
+0

Quale versione è questa? Funziona come da v0.19.1? –

Problemi correlati