在熊猫中设置WithCopyWarning

时间:2018-06-06 21:44:47

标签: python pandas dataframe

我有一个如下所示的数据框:

df = 
           index     P01  unten   oben     RV   R2_simu
2014-05-23 03:00:00  0.0    0.0    0.9    0.8         0
2014-05-23 06:00:00  0.5    0.7    1.4    0.1         0
2014-05-23 07:00:00  1.0    2.4    2.4    0.6         0
2014-05-23 08:00:00 0.55   15.7   28.0    0.3         0
....

我尝试循环:

for i in range(0, len(df)):

    if df.P01[i] >= df.RV[i]:
        df.R2_simu[i] = 0 

    elif df.P01[i] < df.RV[i]:
        df.R2_simu[i] = df.RV[i]
    else:
        pass

我希望收到一个新的数据框,如下所示,

df = 
           index     P01  unten   oben     RV   R2_simu
2014-05-23 03:00:00  0.0    0.0    0.9    0.8       0.8
2014-05-23 06:00:00  0.5    0.7    1.4    0.1         0
2014-05-23 07:00:00  1.0    2.4    2.4    0.6         0
2014-05-23 08:00:00 0.55   15.7   28.0    0.6       0.6

然而,我收到消息 SettingWithCopyWarning ,我尝试重写

 df.R2_simu[i] = df.RV[i]

 df.R2_simu[i] = df.RV[i].copy()

但似乎问题仍然存在。

有谁知道如何处理它?提前致谢!

2 个答案:

答案 0 :(得分:2)

SettingWithCopyWarning是使用类似语法的常见副作用:

df.R2_simu[i] = df.RV[i]

开发人员建议使用df.loc[]而不是使用索引来访问元素。另请注意,使用for i in range(0, len(df)):不如使用df.iterrows或向量化函数更常见。例如,这与代码的一部分相同:

df['R2_simu'] = df['R2_simu'].apply(lambda row: 0 if row['P01'] >= row['RV']) # it's generally more common to use dict notation in pandas
OR # if you really like dot notation...
df.R2_simu = df.R2_simu.apply(lambda row: 0 if row.P01 >= row.RV)

答案 1 :(得分:2)

尝试使用loc索引设置数据框上的值,这可能是内部创建和写入df副本的原因。将你的循环改为

for i in range(0, len(df)):

    if df.P01[i] >= df.RV[i]:
        df.loc[i,"R2_simu"] = 0 

    elif df.P01[i] < df.RV[i]:
        df.loc[i,"R2_simu"] = df.RV[i]
    else:
        pass

更好的是你不使用循环,而是使用矢量访问:

df.loc[df.loc[:,"P01"] >= df.loc[:,"RV"],"R2_simu"] = 0
df.loc[df.loc[:,"P01"] < df.loc[:,"RV"],"R2_simu"] = df.loc[df.loc[:,"P01"] < df.loc[:,"RV"],"RV"]

从内到外解释

df.loc[:, "col"] =&gt;取每行:和列col

df.loc[x1 >= x2, "R2_simu"] =&GT;仅考虑x1 >= x2和列R2_simu

的行