新增欄位出現SettingWithCopyWarning 錯誤
各位老師好,
我在嘗試擷取Income 作為一個subset然後新增一個欄位,其單位為千元。並利用pd.cut將數據分成數份。
我相信此做法會跟D16的範例雷同。但卻出現了 SettingWithCopyWarning。
D16範例如下:
我的D18練習如下:
回答列表
-
2019/09/16 上午 00:24Wei-po Tsai贊同數:1不贊同數:0留言數:1
Hi!同學你好:
============================================
我是偽菠菜(Wei-Po Tsai),是個剛學Python的新手,
對你提到的問題很有興趣,所以研究了一下,請多指教。
============================================
在這邊會出現Warning,主要原因是系統建議你使用 .loc 來進行這部份的操作。
以下的In[5]是改用.loc之前;
以下的In[6]是改用.loc之後
至於詳細的原因,系統建議的文件中有說明,所以在這邊我就不獻醜啦!
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#indexing-view-versus-copy
文件中說明的部分,擷錄如下圖:
Edited By:偽菠菜(Wei-Po Tsai)
-
2019/09/16 下午 01:58計弘達贊同數:2不贊同數:0留言數:2
回答「D18的程式跟D16邏輯基本一樣,D16的卻沒有出現這個提示。不曉得是什麼原因造成這個差異。」
原因是在 D016 的第一段程式中有過濾 warning message 的兩行指令:
# 忽略警告訊息
import warnings
warnings.filterwarnings('ignore')
-
2019/09/16 下午 09:49張維元 (WeiYuan)贊同數:2不贊同數:0留言數:1
樓上兩位同學的解釋都很好:)
關於這個「SettingWithCopyWarning」我稍微補充下,這個問題其實是來自於「chained indexing」。複雜的 DF 存取,會產生不可預期的狀況產生(有時候是 Copy 有時候是 View),因此官方建議採用 loc 的方法存取資料。可以看這個:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#indexing-view-versus-copy