もんた
pandasでついやってしまうSettingWithCopyWarningの原因と対処法をメモしておきます。
目次
SettingWithCopyWarningが発生する例
import pandas as pd
# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# A列が1よりも大きい部分を取り出す。
subset = df[df['A'] > 1]
# このsubsetを使って以下を実行するとエラーになる。
subset['C'] = subset['B'] * 2
subsetがdfの一部分をコピーしたものでなく参照であるため、subsetに対する変更は元のdfに反映されてしまうというのがSettingWithCopyWarningで警告されます。これを防ぐためには、参照渡しを避けてコピーを渡すようにすればOKです。
解決策
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# コピーを渡せば大丈夫
subset = df[df['A'] > 1].copy()
subset['C'] = subset['B'] * 2
もんた
この例は、subset[‘C’] = df[df[‘A’] > 1]][‘B’] * 2 のように連鎖インデクシング(Chained Indexing)が原因でSettingWithCopyWarningが発生しています。