在给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了
博客讲述在给pandas.DataFrame新增列赋值时遇到SettingWithCopyWarning警告,起初未处理导致处理540行DataFrame耗时10秒,后找到避免警告的简单方法,处理时间降至0.2秒。还发现数据类型改变会触发警告,且按官方写法df.loc[i,'v']可解决问题。
5978

被折叠的 条评论
为什么被折叠?



