Pythonのデータ処理によく使われるDataFrame。
表形式のCSVやExcelのデータを読むことができ、集計や加工にとても重宝する。
しかし気をつけて使わないと自分の意図しないタイミングでデータが書き換わってしまうことがあるかもしれない。
今回はpandasでDataFrameの中身が変わってしまう原因と、「pandasでDataFrameの値渡しをする方法」について解説する。
この記事を書いている人
記事を読むメリット
pandasでDataFrameの中身が変わってしまう原因
pandasでDataFrameの中身が変わってしまう原因。
それは参照渡ししたDataFrameを編集してしまっているから。
a = b
とした時、「値渡し」ならbは「aと同じ値を持っているけどコピーされた別の存在」なので、bを編集してもaに変化はない。具体的にコードにすると以下のようになる。
import pandas as pd def change_df(df): df["c3"].iloc[1] = 44 return # ---- passed by reference ---- data_list1 = [ [1,2,3], [2,3,4], [3,4,5] ] col_list = ["c1","c2","c3"] df = pd.DataFrame(data=data_list1, columns=col_list) print(df) # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5 print("df2 = df") df2 = df print('df2["c1"].iloc[1] = 22') df2["c1"].iloc[1] = 22 print("df") print(df) print("df2") print(df2) # df # c1 c2 c3 # 0 1 2 3 # 1 22 3 4 # 2 3 4 5 # df2 # c1 c2 c3 # 0 1 2 3 # 1 22 3 4 # 2 3 4 5 print('change_df(df2)') change_df(df2) print("df") print(df) print("df2") print(df2) # df # c1 c2 c3 # 0 1 2 3 # 1 22 3 44 # 2 3 4 5 # df2 # c1 c2 c3 # 0 1 2 3 # 1 22 3 44 # 2 3 4 5
df2 = df
として df2
というDataFrameを作ってdf2の中身を書き換えているが、参照渡しで本体はdf同じであるためprintするとdfも同じように書き換わっている。
ではどうすれば参照渡しではなく df2
を別のDataFrameとして作ることができるのか。
pandasでDataFrameの値渡しをする方法
pandasでDataFrameを参照渡しではなく値渡しする方法。
それは copy()
メソッドを使うことだ。
copy()
メソッドを使うと、値だけコピーした別の変数を作ることができる。
具体的には以下の通り。
# ---- passed by value ---- print('Initialize df') data_list1 = [ [1,2,3], [2,3,4], [3,4,5] ] col_list = ["c1","c2","c3"] df = pd.DataFrame(data=data_list1, columns=col_list) print(df) # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5 print("df2 = df.copy()") df2 = df.copy() print('df2["c1"].iloc[1] = 22') df2["c1"].iloc[1] = 22 print("df") print(df) print("df2") print(df2) # df # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5 # df2 # c1 c2 c3 # 0 1 2 3 # 1 22 3 4 # 2 3 4 5 print('change_df(df2)') change_df(df2) print("df") print(df) print("df2") print(df2) # df # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5 # df2 # c1 c2 c3 # 0 1 2 3 # 1 22 3 44 # 2 3 4 5
df2を作る際に df2 = df.copy()
とすることで、dfの中身をコピーした別の変数(インスタンス)としてdf2を作ることができる。
df2はdfとは別の存在なので、中身を編集してもdf自体に影響はない。
【Python】pandasでDataFrameの値渡しをする方法 まとめ
pandasでDataFrameの中身が変わってしまう原因は参照渡ししたDataFrameを編集してしまっているから。
DataFrameの値渡しをするには copy()
メソッドを使って別の変数(インスタンス)を作成すると元となったDataFrameに影響しないDataFrameを作成できる。
他にもpandasでExcelを読み書きする方法の記事もあるので、気になったら参考にしてほしい。