web-dev-qa-db-ja.com

パンダ:SettingWithCopyWarning

任意の数(この場合は100)よりも大きいPandasDataFrameの値をNaNに置き換えたい(この大きな値は実験の失敗を示しているため) )。以前は、これを使用して不要な値を置き換えました。

sve2_all[sve2_all[' Hgtot ng/l'] > 100] = np.nan

ただし、次のエラーが発生しました。

-c:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
C:\Users\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\core\indexing.py:346: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s

このStackExchangeの質問 から、この警告は無視できる場合もありますが、これが自分の状況に当てはまるかどうかを確認するのに十分な議論を続けることができません。この警告は基本的に、DataFrameの値の一部を上書きすることを知らせてくれますか?

編集:私が知る限り、すべてが正常に動作しました。フォローアップとして、値を非標準に置き換える方法はありますか?値を置き換えるより良い方法はありますか?

18
Jason

エラーメッセージで示唆されているように、locを使用してこれを行う必要があります。

sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan

警告は、コピーの変更を停止するためのものです(ここではsve2_all[sve2_all[' Hgtot ng/l'] > 100]潜在的にコピーであり、変更されても元のフレームは変更されません。場合によっては正常に動作する可能性がありますが、pandasすべての場合に動作を保証することはできません...ご自身の責任で使用してください(注意してください!;)))

23
Andy Hayden

---私のために解決された問題---

「.loc」コマンドを使用しても、float-> intを変換しようとすると、その警告エラーが発生しました。私の間違いは、操作の前にデータフレーム(マスク付き)をフィルタリングしたため、データフレームのアイテム/列のごく一部で変換が行われ、結果は混合型の列であり、混乱を引き起こすことでした。マスク(データフィルター)の前にデータフレームを変換することで問題を解決しました。

2
ilyes

DataFrame全体の内容をリセットしようとしたときにこの警告が表示されましたが、locまたはilocを使用して解決できませんでした。

df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning

しかし、データとして含まれているndarrayに解決することで問題は解決しました。

df.values[:, :] = new_values # no warnings and desired behavior
2

他のユーザーから提案されているように、次を試すことができます。

myindex = sve2_all[' Hgtot ng/l'] > 100

sve2_all.loc[myindex, 'yourcolumn'] = np.nan

ピボットテーブルの作成で問題が発生した場合(pivot_table rowキーワードはpandas 0.16.0 #417)行と列ではなく、インデックスと列の新しい構文を使用する必要があります。 https://github.com/yhat/ggplot/issues/417

こちらもご覧ください:

Pandas SettingWithCopyWarning

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

1
George Zoto