pandas SettingWithCopyWarnig:A value is trying to be set on a copy of a slice from a DataFrame

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在给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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值