web-dev-qa-db-ja.com

Pandas SettingWithCopyWarning

Python 3.4およびPandas 0.15.0

dfはデータフレームであり、col1は列です。以下のコードでは、値10の存在を確認し、そのような値を1000に置き換えています。

df.col1[df.col1 == 10] = 1000

別の例を示します。今回は、インデックスに基づいてcol2の値を変更しています。

df.col2[df.index == 151] = 500

これらは両方とも以下の警告を生成します。

-c:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

最後に、

cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].applymap(some_function)

これにより、同様の警告が生成されますが、提案が追加されています。

Try using .loc[row_indexer,col_indexer] = value instead

警告で指摘された議論を理解しているかどうかはわかりません。これらの3行のコードを記述するより良い方法は何でしょうか?

操作が機能したことに注意してください。

22
ba_ul

ここでの問題は:df.col1[df.col1 == 10]はコピーを返します。

だから私は言うだろう:

row_index = df.col1 == 10
# then with the form .loc[row_indexer,col_indexer]
df.loc[row_index, 'col1'] = 100
39
Paul H

「loc」の使用についてPaulと合意しました。

Applymapの場合、これを行うことができるはずです。

cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)
5
koelemay