2017-11-20 6 views
-2

Ich mache eine sehr einfache Transformation auf einem Pandas-Datenrahmen mit einer Funktion, aber ich habe nicht erwartet, dass die Funktion den Eingabedatenrahmen ändern wird (aber es tat). Ich frage mich, warum ...Python-Funktion verhält sich unerwartet

Hier ist mein Code:

x = pd.DataFrame({'a': [1,2,3], 'b': [3,4,5]}) 

def transform(df, increment): 
    new_df = df 
    new_df.a = new_df.a + increment 
    return new_df 

new_x = transform(x, 1) 

new_x # output shows new_x.a is [2,3,4], which is expected. 
x # output shows x.a is also [2,3,4]. I thought it should be [1,2,3] 

Warum ist dies der Fall? Ich denke, in der Funktion werden alle Operationen auf dem new_df ausgeführt, so dass der Eingang x vor und nach dem Ausführen dieser transform-Funktion genau gleich bleiben sollte, oder?

+4

'new_df = df' Kopiert * nicht * den Datenrahmen. Sie machen einfach einen weiteren Verweis auf das Objekt * same *. –

+0

Ja, 'new_df' und' df' sind zwei Namen für das gleiche Objekt. – kindall

+1

'new_df = df.copy()' –

Antwort

1

Dies ist, weil es keine Kopie, sondern eine andere „Referenz“ des x Objekt

x = pd.DataFrame({'a': [1,2,3], 'b': [3,4,5]}) 


def transform(df, increment): 
    new_df = df.copy() # <--- piece to change 
    new_df.a = new_df.a + increment 
    return new_df 

new_x = transform(x, 1) 

new_x # output shows new_x.a is [2,3,4], which is expected. 
x # output shows x.a is now [1,2,3]. 

Wenn Sie .copy() das Sie das erwartete Verhalten hinzufügen schafft geben

Verwandte Themen