【Pandas】 データフレームをコピーしたいときにcopy()を使う意味

データフレームは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()を使わないといけないケースが多そうな気がしますが)

ではでは👋