2014-12-28 23 views
59

Bei der Auswahl eines Unterdatenrahmens aus einem übergeordneten Datenrahmen, habe ich festgestellt, dass einige Programmierer eine Kopie des Datenrahmens mit der .copy() Methode machen.Warum sollte ich eine Kopie eines Datenrahmens in Pandas machen

Warum machen sie eine Kopie des Datenrahmens? Was passiert, wenn ich keine Kopie mache?

+2

Meine Vermutung ist, dass sie zusätzliche Vorsichtsmaßnahmen ergreifen, um den Quelldatenrahmen nicht zu ändern. Wahrscheinlich unnötig, aber wenn Sie interaktiv etwas zusammenwerfen, ist es besser als Nachsicht. –

+4

Ich nehme an, das ist keine blöde Frage, um eine negative Frage zu stellen. –

Antwort

66

Dies erweitert sich auf Pauls Antwort. In Pandas gibt die Indizierung eines Datenrahmens einen Verweis auf den ursprünglichen Datenrahmen zurück. Wenn Sie also die Teilmenge ändern, ändert sich der ursprüngliche DataFrame. Daher sollten Sie die Kopie verwenden, wenn Sie sicherstellen möchten, dass sich der ursprüngliche DataFrame nicht ändert. Betrachten Sie den folgenden Code ein:

df = DataFrame({'x': [1,2]}) 
df_sub = df[0:1] 
df_sub.x = -1 
print(df) 

Sie erhalten:

x 
0 -1 
1 2 

Im Gegensatz dazu werden die folgenden Blätter df unverändert:

df_sub_copy = df[0:1].copy() 
df_sub_copy.x = -1 
19

Denn wenn man keine Kopie machen dann Die Indizes können auch an anderer Stelle manipuliert werden, auch wenn Sie den Datenrahmen einem anderen Namen zuweisen.

Zum Beispiel:

df2 = df 
func1(df2) 
func2(df) 

func1 kann df ändern, indem df2 modifizieren, so dass zu vermeiden:

df2 = df.copy() 
func1(df2) 
func2(df) 
3

Es ist notwendig zu erwähnen, dass Kopie oder Ansicht der Rückkehr von der Art der Indexierung abhängt.

Die Pandas Dokumentation sagt:

eine Ansicht im Vergleich zu einer Kopie Rückkehr

Die Regeln darüber, wann ein Blick auf die Daten zurückgegeben wird, sind völlig abhängig von NumPy. Immer wenn ein Array von Etiketten oder ein boolescher Vektor an der Indizierung beteiligt sind, wird das Ergebnis eine Kopie sein. Mit einzelner Label/Skalar-Indizierung und Slicing, z.B. df.ix [3: 6] oder df.ix [:, 'A'] wird eine Ansicht zurückgegeben.

Verwandte Themen