事象
以下のコードでSettingWithCopyWarningが発生していました。
def proc(df)
df = df[df[col] == 'test']
# 集計値項目を数値型に変換
df.loc[:, col_1] = pd.to_numeric(df[col_1], errors='coerce')
df.loc[:, col_2] = pd.to_numeric(df[col_2], errors='coerce')
# 差を計算
df.loc[:, col_diff] = df.loc[:, col_1] - df.loc[:, col_2]
ワーニング内容は以下のとおりです。
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
対応方法
SettingWithCopyWarningはPandasがデータフレームのコピーに対して操作を行っているか、それとも元のデータフレームに対して操作を行っているのかを識別できない場合に発生します。この警告を避けるためには、操作を行う前にデータフレームの明示的なコピーを作成することが推奨されます。
以下の修正コードではワーニングが発生しなくなりました。
def proc(df)
df = df[df[col] == 'test'].copy()
# 集計値項目を数値型に変換
df.loc[:, col_1] = pd.to_numeric(df[col_1], errors='coerce')
df.loc[:, col_2] = pd.to_numeric(df[col_2], errors='coerce')
# 差を計算
df.loc[:, col_diff] = df.loc[:, col_1] - df.loc[:, col_2]
2行目の末尾に.copy()を付与し、コピー処理であることを明示しました。