2014-12-28 1 views
59

Quando si seleziona un sub dataframe da un dataframe principale, ho notato che alcuni programmatori eseguono una copia del frame di dati utilizzando il metodo .copy().perché dovrei fare una copia di un frame di dati in panda

Perché stanno facendo una copia del frame dati? Cosa succederà se non faccio una copia?

+2

La mia ipotesi è che stanno prendendo precauzioni extra per non modificare il frame dei dati di origine. Probabilmente non necessario, ma quando lanci qualcosa insieme in modo interattivo, meglio prevenire che curare. –

+4

Presumo che questa non sia una domanda stupida per averne una negativa. –

risposta

66

Questo amplia la risposta di Paolo. In Panda, l'indicizzazione di un DataFrame restituisce un riferimento al DataFrame iniziale. Pertanto, la modifica del sottoinsieme cambierà il DataFrame iniziale. Quindi, vorresti usare la copia se vuoi assicurarti che il DataFrame iniziale non debba cambiare. Si consideri il seguente codice:

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

Otterrete:

x 
0 -1 
1 2 

Al contrario, i seguenti foglie df invariato:

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

Perché se non si fanno una copia poi gli indici possono essere manipolati altrove anche se si assegna il dataFrame a un nome diverso.

Ad esempio:

df2 = df 
func1(df2) 
func2(df) 

func1 può modificare df modificando DF2, in modo da evitare che:

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

È necessario ricordare che il ritorno di copia o vista dipende dal tipo di indicizzazione.

La documentazione panda dice:

Restituzione di una vista rispetto a una copia

Le regole su quando viene restituita una vista sui dati sono del tutto dipendenti da NumPy. Ogni volta che un array di etichette o un vettore booleano sono coinvolti nell'operazione di indicizzazione, il risultato sarà una copia. Con singola etichetta/indicizzazione scalare e affettatura, ad es. df.ix [3: 6] o df.ix [:, 'A'], verrà restituita una vista.