スポンサーリンク

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

スポンサーリンク