**
解决方案:SettingWithCopyWarning
**
场景:在对读取的csv文件进行更新列元素内容或者更新整列时遇到警告,但不会报错。
此问题是由于DataFrame中的链式索引导致的。
举例说明
先给一个DataFrame
import pandas as pd
import numpy as np
data = np.arange(4,13).reshape((3,3))
num = pd.DataFrame(data,columns=['a','b','c'])
print(num)
输出如下:插入一列 ‘d’ ,并修改num的 c 列 均为99,再输出c列
data = np.arange(4,13).reshape((3,3))
num = pd.DataFrame(data,columns=['a','b','c'])
num['d'] = 0
print(num)
#修改c列
for _ in range(len(num)):
num.iloc[_][2] = 99
print(num.iloc[:,2])
结果报错:
这是由于插入d列后改变了num的初始索引,引起来DataFrame的链式索引,从而会在修改DataFrame中元素时报警告,甚至会无法实现修改功能。
解决方法
方法一
最简单的方法是在修改元素时直接修改,如不能实现功能,请看方法二
不用索引表示要修改的部分:
#修改c列
num.iloc[:,2] = 99
print(num.iloc[:,2])
结果如下:
方法二
如果不能实现功能,先将要修改的部分写为一个新的数组,再将c列 直接修改 或 替换(先删除,在插入新的c列)即可:
直接修改:
data = np.arange(4,13).reshape((3,3))
num = pd.DataFrame(data,columns=['a','b','c'])
num['d'] = 0
print(num)
A = np.ones(num.shape[0]) *99
print(A)
#直接修改c列
num['c'] = A
rint(num.iloc[:,2])
print(num)
结果如下:
替换(删除c列在插入新的c列):
#删除c列,在插入新的c列
del num['c']
num.insert(1,'c',A)
print(num.iloc[:,2])
print(num)
结果如下:
此时我们就解决了SettingWithCopyWarning的问题,谢谢大家!
版权声明:本文为qq_44825630原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。