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']
压缩成一行。