Python 在熊猫中设置CopyWarning
我有一个数据框,如下所示:Python 在熊猫中设置CopyWarning,python,pandas,dataframe,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-0
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
但是,我收到消息设置为CopyWarning,我尝试重写
df.R2_simu[i] = df.RV[i]
到
但问题似乎仍然存在
有人知道怎么处理吗?提前谢谢
SettingWithCopyWarning
是使用类似语法的常见副作用:
df.R2_simu[i] = df.RV[i]
开发人员建议使用df.loc[]
而不是使用索引来访问元素。还请注意,对范围(0,len(df))中的i使用:
比使用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)
SettingWithCopyWarning
是使用类似语法的常见副作用:
df.R2_simu[i] = df.RV[i]
开发人员建议使用df.loc[]
而不是使用索引来访问元素。还请注意,对范围(0,len(df))中的i使用:
比使用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)
尝试使用索引设置数据帧上的值,这可能是创建并写入
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
范围(0,len(df))内的i的:
如果df.P01[i]>=df.RV[i]:
df.loc[i,“R2_simu”]=0
elif df.P01[i]
更好的是,您不使用循环,而是使用向量访问:
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[df.loc[:,“P01”]>=df.loc[:,“RV”],“R2_simu”]=0
df.loc[df.loc[:,“P01”]
从内到外解释
df.loc[:,“col”]
=>获取每一行:
,以及每一列col
<代码> df.xc[x1>x2,r2siimu ] = >只考虑行>代码> x1>=x2< /代码>,列<代码> R2Simu< P>试着用索引设置数据文件上的值,这可能是在内部创建了一个代码< > 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
范围(0,len(df))内的i的:
如果df.P01[i]>=df.RV[i]:
df.loc[i,“R2_simu”]=0
elif df.P01[i]
更好的是,您不使用循环,而是使用向量访问:
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[df.loc[:,“P01”]>=df.loc[:,“RV”],“R2_simu”]=0
df.loc[df.loc[:,“P01”]
从内到外解释
df.loc[:,“col”]
=>获取每一行:
,以及每一列col
<代码> df.LOC[x1>= x2,r2as-siMu ] = >只考虑行>代码> x1>=x2和列<代码> R2SIMU < /P>不需要<代码> DF.LOC [:“P01”] < /代码>;您只需执行
df[“P01”]
。这可以用df['R2_simu']=df['RV'].mul(df['P01']
压缩成一行。您不需要df.loc[:,“P01”]
;您只需执行df[“P01”]
。这可以用df['R2_simu']=df['RV'].mul(df['P01']
压缩成一行。