两个主要原因

SettingWithCopyWarning通常在用户使用副本时产生,具体会发生在以下两种情况:

  1. 链式赋值(Chained assignment)
    df[a:b][c:d] = x,该操作包含两次链式操作,第一次会生产新的dataframe,第二次的赋值刷在该新的df上进行。
    解决方案是使用loc,即df.loc[a:b,c:d] = x

  2. 蔽链(Hidden chaining)
    如下面的代码,df2是由df经过get操作得来的,前者可能是后者的副本,也有可能不是。当修改df2的时候,有可能修改了df,所以也会出现Warning.

    1
    2
    df2 = df.loc[df.a==df.b]
    df2.loc[c,d] = x

    解决方案是明确说明df2df的副本,即:

    1
    df2 = df.loc[df.a==df.b].copy()

如果你很清楚以上原因,可以直接关闭警告: pd.set_option('mode.chained_assignment', None)

Reference

SettingwithCopyWarning: How to Fix This Warning in Pandas