任意の数(この場合は100)よりも大きいPandas
DataFrame
の値を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
の値の一部を上書きすることを知らせてくれますか?
編集:私が知る限り、すべてが正常に動作しました。フォローアップとして、値を非標準に置き換える方法はありますか?値を置き換えるより良い方法はありますか?
エラーメッセージで示唆されているように、locを使用してこれを行う必要があります。
sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan
警告は、コピーの変更を停止するためのものです(ここではsve2_all[sve2_all[' Hgtot ng/l'] > 100]
は潜在的にコピーであり、変更されても元のフレームは変更されません。場合によっては正常に動作する可能性がありますが、pandasすべての場合に動作を保証することはできません...ご自身の責任で使用してください(注意してください!;)))
---私のために解決された問題---
「.loc」コマンドを使用しても、float-> intを変換しようとすると、その警告エラーが発生しました。私の間違いは、操作の前にデータフレーム(マスク付き)をフィルタリングしたため、データフレームのアイテム/列のごく一部で変換が行われ、結果は混合型の列であり、混乱を引き起こすことでした。マスク(データフィルター)の前にデータフレームを変換することで問題を解決しました。
DataFrame全体の内容をリセットしようとしたときにこの警告が表示されましたが、loc
またはiloc
を使用して解決できませんでした。
df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning
しかし、データとして含まれているndarrayに解決することで問題は解決しました。
df.values[:, :] = new_values # no warnings and desired behavior
他のユーザーから提案されているように、次を試すことができます。
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
こちらもご覧ください:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy