pandas中警告SettingWithCopyWarning

import pandas as pd

data = pd.read_csv('data.csv')
ind = [1,2,3,4]
test_save_tensor = new_series
data_normal_smiles = data.iloc[ind, :]
data_normal_smiles.loc[:, 'tensors'] = new_series

这边报了一个 SettingWithCopyWarning, 下面推荐用 .loc[row_indexer, col_indexer] ,但是我第七行已经是用 .loc 方法了啊。。。(原来用的是 data_normal_smiles['tensors']=new_series) ,也是报警告的。

什么原因呢,查了一下,这是出现链式索引的问题(chained indexing)。在第六行我们获取了 data 的某几行 data_normal_smiles (称作view)。紧接着第七行就对 data_normal_smiles 新添加一列。这个时候pandas就疑惑了,data 中要不要也添加一列呢?因为我们没有在第六行显式指定 data_normal_smilesdata 那几行的一个副本(copy)。所以pandas当然也可以认为我们想做 data.iloc[ind, :]['tensors']=new_series

这个时候我们就明白pandas为什么要推荐使用 loc 方法了,他的意思其实是,如果我们想做 data.iloc[ind, :]['tensors']=new_series 的话,那么应该用 data.iloc[ind, 'tensors']=new_series,而不是两次切片(chained indexing)。

但我们原意并非要改变data,data在取过那几行之后已经没有价值了,不用改变。这个时候我们需要的是创建 data 那几行的一个副本:data_normal_smiles=data.iloc[ind, :].copy() 。把第六行换成这个,第七行就不会报警告了。因为pandas明确了,我们改变的只是 data_normal_smiles ,不改变 data

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值