logo
Loading...

新增欄位出現SettingWithCopyWarning 錯誤 - Cupoy

各位老師好,我在嘗試擷取Income 作為一個subset然後新增一個欄位,其單位為千元。並利用pd...

ml100-3,ml100-3-d18

新增欄位出現SettingWithCopyWarning 錯誤

2019/09/15 上午 11:24
機器學習共學討論版
黃向偉
觀看數:110
回答數:3
收藏數:0
ml100-3
ml100-3-d18

各位老師好,

我在嘗試擷取Income 作為一個subset然後新增一個欄位,其單位為千元。並利用pd.cut將數據分成數份。

我相信此做法會跟D16的範例雷同。但卻出現了 SettingWithCopyWarning。


D16範例如下:

我的D18練習如下:

回答列表

  • 2019/09/16 上午 00:24
    Wei-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