我有一个如下所示的数据框:
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()
但似乎问题仍然存在。
有谁知道如何处理它?提前致谢!
答案 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