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)