データフレームはPandasにおいてメインを担うであろう2次元表形式のオブジェクトです。プログラムの上ではデータフレームを加工する場面が多いですが、一方でオリジナルのデータフレームも保持しておきたいものです。そういう際は別変数にコピーしますが、=を使ってそのままデータフレームをコピーする場合と、copy()を使ってコピーする二通りが考えられます。
=を使っているとcopy()を使えと警告が出る場合もあります。今回は、それぞれを使った場合の挙動の違いを見ていきたいと思います。
準備
まずは今回検証に用いるデータフレームを作成します。
import pandas as pd
df = pd.DataFrame({ 'A' : 'ああああ',
'B' : 'ううううう',
'C' : 'おぉぉぉぉ'}, index=[1,2,3])
print(df)
# A B C
1 ああああ ううううう おぉぉぉぉ
2 ああああ ううううう おぉぉぉぉ
3 ああああ ううううう おぉぉぉぉ
=を使った場合の挙動
まずは、=だけでデータフレームをコピーしてみます。このやり方とは、以下のようなものです。
df1 = df
オリジナルのdfを新たな変数df1にぶち込んだだけです。
結論から言うと、このやり方でdf1に変更を加えると、オリジナルのdfにもその変更が適用されてしまいます。試しにdf1に新たな列”D”を作成してみます。
import pandas as pd
df = pd.DataFrame({ 'A' : 'ああああ',
'B' : 'ううううう',
'C' : 'おぉぉぉぉ'}, index=[1,2,3])
print(df)
df1 = df
df1["D"] = "wwwww"
print(df)
# A B C
1 ああああ ううううう おぉぉぉぉ
2 ああああ ううううう おぉぉぉぉ
3 ああああ ううううう おぉぉぉぉ
A B C D
1 ああああ ううううう おぉぉぉぉ wwwww
2 ああああ ううううう おぉぉぉぉ wwwww
3 ああああ ううううう おぉぉぉぉ wwwww
df1に変更を加えたはずなのに、dfにも列”D”が追加されてしまっています。この方法では、df1は参照渡しとなるためです。
参照渡しとは変数の渡し方の1つで、この場合参照先(df1)は参照元(df)の値そのものではなく、どこにdfがあるかという番地情報を保持します。なのでdf1をイジったつもりでも、実際はdf1からdfの番地を参照してdfに変更が加えられてしまいます(本記事での参照渡しについての詳述は避けます)。
なので、オリジナルのデータフレームも保持しておきたい場合にこの方法は適していません。
copy()を使う
pd.DataFrame()にはcopy()関数が用意されています。文字通りオリジナルのデータフレームをコピーするための関数です。以下のように使います。
df1 = df.copy()
これを使ってdf1に変更を加えた場合のdfとdf1の中身を確認してみます。
import pandas as pd
df = pd.DataFrame({ 'A' : 'ああああ',
'B' : 'ううううう',
'C' : 'おぉぉぉぉ'}, index=[1,2,3])
print(df)
df1 = df.copy()
df1["D"] = "wwwww"
print(df)
print(df1)
# A B C
1 ああああ ううううう おぉぉぉぉ
2 ああああ ううううう おぉぉぉぉ
3 ああああ ううううう おぉぉぉぉ
A B C
1 ああああ ううううう おぉぉぉぉ
2 ああああ ううううう おぉぉぉぉ
3 ああああ ううううう おぉぉぉぉ
A B C D
1 ああああ ううううう おぉぉぉぉ wwwww
2 ああああ ううううう おぉぉぉぉ wwwww
3 ああああ ううううう おぉぉぉぉ wwwww
df1には変更が適用されていますが、dfに変化はありません。copy()を使った場合、df1はdfとは関連を持たない別のオブジェクトとして作成されます。
そのため、df1に変更を加えてもオリジナルのdfにその変更が及ぶことはありません。オリジナルのデータフレームも保持しておきたい場合は、copy()を使ってコピーするようにしましょう。
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
初学者の方にはこちらもオススメです^^
まとめ
Pandasのデータフレームをコピーするときの=とcopy()の違いについて検証しました。=のみでコピーすると参照渡しに、copy()を使うと新たなオブジェクトが作成されます。
両者の特徴を押さえて、どちらを使うべきかを判断してください。(copy()を使わないといけないケースが多そうな気がしますが)
ではでは👋