解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

**

解决方案: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])

结果如下:
解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame_第1张图片

方法二

如果不能实现功能,先将要修改的部分写为一个新的数组,再将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)

结果如下:
解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame_第2张图片

替换(删除c列在插入新的c列):

#删除c列,在插入新的c列
del num['c']
num.insert(1,'c',A)
print(num.iloc[:,2])
print(num)

结果如下:
解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame_第3张图片

此时我们就解决了SettingWithCopyWarning的问题,谢谢大家!

你可能感兴趣的:(python)