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
