在给pandas.DataFrame的新增的列进行赋值操作时,总是会报:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
我看这是个warning,程序还能继续运行, 就没管它。随后发现一个无法忽视的问题:
处理一个540行的DataFrame,竟然花了10秒!
而这段代码的功能其实很简单,就是拿A列和B列相除得到C列的值:
df['v']=None #新增一列记录速度
for i in df.index:
D=df.loc[i]['Displacement'] #从本行A列得到位移
T=df.loc[i]['Running Time'] #从本行B列得到时间
df.loc[i]['v']=D/T #计算出速度放到'v'列
针对这个warning有很多文章,我发现了一个很简单的办法避免这个 warning后,处理时间就变成了0.2秒。
办法很简单:将新建’v‘列的那句改成df['v']=0.0
经过试验发现,如果数据表中的某个格子,新赋的值和原来的值数据类型不一样,就会触发这个Warning
至于为什么,我也没搞明白,反正发现了这个小方法就先用着了。
如果有大神知道原因还请留言赐教^_^
——————————分割线————————————
后来发现有时候即便没有更改当前单元格的数据类型,依然会报这个Warning,搜了下pandas官方文档发现:
pandas.DataFrame.loc其实就没有df.loc[i]['v']这样的写法,官方的写法是df.loc[i,'v']。
改成后面这个写法就OK了