2017-11-20 9 views
-2

pandasデータフレームで関数を使用して非常に単純な変換を行っていますが、関数が入力データフレームを変更するとは思いませんでした。私はここになぜ...Python関数が予期せず動作する

を思っていた私のコードです:

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] 

これが事実であるのはなぜ?私は、この機能では、すべての操作がnew_dfで実行されると思いますので、入力xは、このtransformの機能を実行する前とまったく同じ状態を保つ必要がありますか?

+4

'new_df = df'の別の「参照」データフレームをコピーしません。 *同じ*オブジェクトへの別の参照を作成するだけです。 –

+0

はい、 'new_df'と' df'は同じオブジェクトの2つの名前です。 – kindall

+1

'new_df = df.copy()' –

答えて

1

これは、それがコピーを作成していないためであるが、x オブジェクト

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]. 

あなたが.copy()を追加する場合、これはあなたに期待される動作を与える

関連する問題