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_smiles
为 data
那几行的一个副本(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
。