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
文章评论