Python
numpy
pandas

ブールインデックス参照とSettingWithCopyWarning

概要

pandasにて、データフレームのhoge列の0以下の値を欠損値に置換しようと、
以下のようにコードを書くと、SettingWithCopyWarningがでる。
この警告は、データフレームのコピーを使っているため、無駄にメモリを使っていますよというふうにお知らせしてくれているもので、処理自体はうまくいっているらしいのだが、赤背景の警告文章が表示されると落ち着かないので、調査してみた。

訂正

エラーの最後に提示されているドキュメントによると、SettingWithCopyWarningはindexingの結果がcopyなのかviewなのかは文脈に依存してしまうpandasの仕様を考慮したもので、メモリ使用量に関する警告ではありません。つまり「とりあえず言われた通りに代入はしたけど、もしかしたらコピーに対して代入してるかもしれないので、オリジナルのDataFrameの値は変わってないかもしれないよ。気をつけてね。」という警告です。したがって参考記事にある以下の記事のメモリ使用量がどうこうという理解は完全に的外れです。

だそうです。
df[df.hoge < 0, 'hoge'] = np.nan

df.loc[df.hoge < 0, 'hoge'] = np.nan

df.loc[df.hoge < 0, 'hoge'] = np.nan
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

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s

原因

pandas(numpy)の配列に対して、ブールインデックス参照によって抽出されたデータは、必ずもとデータのコピーであることが原因となっている。

解決策

ブールインデックスを使わずに、値を置換すればいいのではないかと思う。
df.hogewhere(df.hoge >= 0, np.nan, inplace= True)を実行してみたところ、やはり警告文が出た。

結論

どなたか解決策を教えてください。

参考記事

Pythonの覚え書き(DataFrameのSettingWithCopyWarningの対処方法)
SettingWithCopyWarningメモ
python pandas で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を出ないようにする