pandasのDataFrameの値を更新する方法がいくつかあるので、後で見返す為にも更新方法をまとめておく。
以下のlocやwhereの他に一括更新の方法がある。
参考
DataFrameの値を更新する方法
pandasのDataFrameの値を更新する方法がいくつかあるが、大きく以下の3つの方法に分けられる。
- 値を一括代入
- 条件に合致するカラムを更新
- 別のDataFrameで上書き
各方法についてDataFrameを用いながら説明する。
import pandas as pd data_list1 = [ [1,2,3], [2,3,4], [3,4,5] ] col_list1 = ["c1","c2","c3"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5
値を一括代入
値を一括代入する方法は簡単だが、全行を一気に更新してしまうので初期化くらいにしか使えない。
df1["c3"]=1 print(df1) # c1 c2 c3 # 0 1 2 1 # 1 2 3 1 # 2 3 4 1
条件に合致するカラムを更新
条件に合致するカラムだけ更新したい場合は、loc
を用いる。
df1.loc[df1["c3"]>3, ["c3"]]=1 print(df1) # c1 c2 c3 # 0 1 2 3 # 1 2 3 1 # 2 3 4 1
loc
を用いずに更新しようとしても、locを使うように促す警告が出て更新できない。
df1[df1["c3"]>3]["c3"]=1 print(df1) # SettingWithCopyWarning: # A value is trying to be set on a copy of a slice from a DataFrame. # Try using .loc[row_indexer,col_indexer] = value instead # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5
条件に合わないセルを更新する方法として、 where
を使う方法もある。
下の例ではカラム"c2"が4以上ではない、つまり4未満である行のカラム"c3"の値を更新している。
df1["c3"].where(df1["c2"] >= 4, 10, inplace=True) # 条件に合わないセルを更新 print(df1) # c1 c2 c3 # 0 1 2 10.0 # 1 2 3 10.0 # 2 3 4 1.0
別のDataFrameで上書き
別のDataFrameで上書きしてカラムを更新する方法もある。
この方法を使えば、親のDataFrameから処理対象の部分だけ抽出して、処理後に親のDataFrameに処理結果を反映させるという事もできる。
data_list2 = [ [5,7], [6,8], ] col_list2 = ["c4","c3"] df2 = pd.DataFrame(data=data_list2, columns=col_list2) print(df2) # c4 c3 # 0 5 7 # 1 6 8 df1.update(df2) print(df1) # c1 c2 c3 # 0 1 2 7.0 # 1 2 3 8.0 # 2 3 4 1.0