スポンサーリンク
DataFrameで"="は参照渡しになる
DataFrameで"="演算子を使うと、DataFrameのデータは参照渡しになります。
例えば、下記のように0埋めしたDataFrameがあったとします。
data = pd.DataFrame(index=range(3), columns=['val1', 'val2']) data.fillna(0, inplace=True) print(data)
newData = data として、newDataの中身を変更してみます。
newData = data newData.val1[2] = 3 newData.val2[0] = 5 print("\ndata=\n", data) print("\nnewData=\n", newData)
結果は、参照渡しなので、dataもnewDataも両方値が変わっています。
data= val1 val2 0 0 5 1 0 0 2 3 0 newData= val1 val2 0 0 5 1 0 0 2 3 0
スポンサーリンク
DataFrame.copy()でディープコピー
コピーする場合は、DataFrame.copy()を使います。
デフォルトで、ディープコピーになります。
newData2 = data2.copy()として、newData2の中身を変更してみます。
newData2 = data2.copy() newData2.val1[2] = 3 newData2.val2[0] = 5 print("\ndata2=\n", data2) print("\nnewData2=\n", newData2)
コピー元のdata2は変わらず、newData2のみが変更されています。
data2= val1 val2 0 0 0 1 0 0 2 0 0 newData2= val1 val2 0 0 5 1 0 0 2 3 0
サンプルコード
下記がサンプルコードになります。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import pandas as pd data = pd.DataFrame(index=range(3), columns=['val1', 'val2']) data.fillna(0, inplace=True) print(data) newData = data newData.val1[2] = 3 newData.val2[0] = 5 print("\ndata=\n", data) print("\nnewData=\n", newData) data2 = pd.DataFrame(index=range(3), columns=['val1', 'val2']) data2.fillna(0, inplace=True) newData2 = data2.copy() newData2.val1[2] = 3 newData2.val2[0] = 5 print("\ndata2=\n", data2) print("\nnewData2=\n", newData2)
下記が実行結果になります。
$ ./sample.py val1 val2 0 0 0 1 0 0 2 0 0 data= val1 val2 0 0 5 1 0 0 2 3 0 newData= val1 val2 0 0 5 1 0 0 2 3 0 data2= val1 val2 0 0 0 1 0 0 2 0 0 newData2= val1 val2 0 0 5 1 0 0 2 3 0
スポンサーリンク