Python データサイエンス

Python - PandasでDataFrame型をコピーする際はシャローとディープの違いに注意

PandasでDataFrame型をコピーしたい時には注意が必要。具体的には、新しい変数へ代入するだけだと参照コピーになり、もとのDataFrameの値が変わると代入先の値も変わってしまう。中身はまるっきり同じだが異なるDataFrameを作りたい場合は、copy()メソッドを使用する。

シャローコピーとディープコピーとは?

PandasのDataFrameでなくとも、ディープコピーとシャローコピーの違いによる影響は様々な場面で出会う。それぞれカンタンなメモを。

シャローコピー

シャローコピーとはいわゆる参照コピーで、変数が格納されている場所をコピーする。
元変数の中身とシャローコピー先の変数の中身は同じ場所の値となる。

元変数の値を変更すると、シャローコピー先の変数も変更されてしまう。
というのも、同じ場所を指しているだけだから。

逆も然りで、シャローコピー先の変数の値を変更すると、元変数の値も変更されてしまう。
というのも、同じ場所を指しているだけだから。

ディープコピー

ディープコピーは、変数の参照先の値を新しい場所にコピーする。
なので元変数の値を書き換えても、ディープコピー先の変数の値は変わらない。
逆も然りで、ディープコピー先の変数の値を変えても、元変数の値に影響はない。

PandasのDataFrame型でシャローコピーとディープコピーを書いてみた

"""
DataFrameのシャローコピーとディープコピー
以下のようなデータを生成
             A      B      C
Tokyo    100.0  200.0  300.0
Osaka     10.0   20.0   30.0
Okinawa    1.5    2.5    3.5
"""
sample_df = pd.DataFrame([[100, 200, 300], [10, 20, 30], [1.5, 2.5, 3.5]],
        index = ['Tokyo', 'Osaka', 'Okinawa'], columns = ["A", "B", "C"])
print("DataFrameのシャローコピーとディープコピー")
sample_df_shallow = sample_df
sample_df_deep = sample_df.copy()
print("sample_df: ")
print(sample_df)
print("shallow: ")
print(sample_df_shallow)
print("deep: ")
print(sample_df_deep)
sample_df["A"]["Tokyo"] = 50.0
print("sample_df: ")
print(sample_df)
print("shallow: ")
print(sample_df_shallow)
print("deep: ")
print(sample_df_deep)

-Python, データサイエンス