Pandas避免遇到SettingwithCopyWarning 问题

Pandas避免遇到SettingwithCopyWarning 问题

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from aDataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation:http://Pandas.pydata.org/Pandas-docs/stable/indexinghtml#indexing-view-versus-copy
#原始代码
locDataTemp = addressReaderDF.iloc[writeNumT:writeNum]
locDataTemp['longitude'] = longitudeList
locDataTemp['latitude'] = latitudeList
#修改后代码
locDataTemp = addressReaderDF.iloc[writeNumT:writeNum].copy()
locDataTemp['longitude'] = longitudeList
locDataTemp['latitude'] = latitudeList
原始代码由于未添加copy,返回的为数据的视图(View),而copy则会返回数据的副本
未添加copy修改数据原数据也跟着改变,为浅拷贝,而copy仅操作数据副本,那就是深拷贝。
也就是说,浅拷贝是创建了对象的一个引用,而深拷贝是创建了对象的一个独立的实体。
警告出现的原因
当 Pandas 检测到链式赋值(Chained Assignment)时会生成警告,链式赋值是指通过使用链式索引来赋值。链式索引(Chaining)是指连续使用多个索引,例如data[1:5][1:3]。
使用链式索引赋值的两种方式:
第一种是显式的,索引是连续的,例如,data.iloc[1][3] = value
第二种是隐式的,例如,先定义 df = data.iloc[1],再使用 df[3] = value 也属于链式赋值
隐式的链式索引可能跨越多行代码发生,也可能在一行代码内发生。因为 winners 是作为 get 操作的输出创建的(data.loc[data.bid == data.price]),它可能是原始 DataFrame 的副本,也可能不是,但除非我们检查,否则我们不能确认。当我们对 winners 进行索引时,我们实际上使用的是链式索引。这意味着当我们尝试修改 winners 时,我们可能也修改了 data。
即使SettingWithCopyWarning警告只在set 时才会发生,但在进行 get 操作时,最好也避免使用链式索引。不仅因为链式操作较慢,而且因为链式索引始终是一个潜在的问题,只要你稍后进行赋值操作,就可能不会影响到原始对象,这可能不是你的预期操作,所以,请不惜一切代价避免使用链式索引。
资料链接:https://www.cnblogs.com/ljhdo/p/12036510.html
		https://www.jianshu.com/p/72274ccb647a
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值