说明并解决 Python 警告 SettingWithCopyWarning

说明并解决 Python 警告 SettingWithCopyWarning,第1张

Python警告 SettingWithCopyWarning

警告(Warning)是指出现了一些需要让用户知道的问题,但又不想停止程序,这时候我们可以使用警告,以下是一个数据框常见的警告 SettingWithCopyWarning ,我们试著将数据框中栏位 b 中数值等于 3 的栏位 a 内容的值改为 1,代码如下所示。

出现 SettingWithCopyWarning
import pandas as pd
B = pd.DataFrame([[1,2,3],[2,3,4],[3,4,5]], columns = ['a','b','c'])
print(B)
print("B[B['b']==3]['a'] = \n{}".format(B[B['b']==3]['a']))
B[B['b']==3]['a']=1
print(B)
print("B[B['b']==3]['a'] = \n{}".format(B[B['b']==3]['a']))

下图显示出现了 SettingWithCopyWarning 的警告,更最要的是并没有完成我们希望的修改,如果正确执行的话,那 B[B[‘b’]==3][‘a’] 的值2,应该被改为1,而非维持原来的值 2。

出现 SettingWithCopyWarning 的警告

链式索引 (chained indexing)

会出现这样的警告的原因,是在设定值的时候不要使用链式索引 (chained indexing),因为链式索引是一个连续调用索引,比方说 B[B[‘b’]==3][‘a’] ,是先得到 B[B[‘b’]==3] 的索引结果,再把这个结果传给 [‘a’] 这个索引 *** 作,但问题是第一次的 *** 作 B[B[‘b’]==3] 所得到的回传结果会是一个新的拷贝(copy),而不是對应到 B 这个数据集了,所以后续的任何修改,都不会对 B 数据集有何影响了。

以下代码我们将链式索引 (chained indexing)逐步运行,并观察最后的结果。B[B[‘b’]==3]是第一层索引运算(FirstIndex);接著我们在根据第一层运算进行第二次索引运算 FirstIndex[‘a’],把这个结果存到第二次的索引运算(SecondIndex);根据第二层索引中索引值为 1 的内容修改为1;最后将第一层索引以及原始的数据集 B 打印出来比较,发现第一层索引(FirstIndex)的内容有修改了,但是原始的数据集 B 并没有修改,因为第一层索引(FirstIndex)只是原始的数据集 B 的一个拷贝(copy),所以对原始数据集是没有影响的。

FirstIndex = B[B['b']==3]
print(FirstIndex)
SecondIndex = FirstIndex['a']
print(SecondIndex)
SecondIndex[1]=1
print(SecondIndex)
print("FirstIndex\n{}\nB[B['b']==3]\n{}".format(FirstIndex,B[B['b']==3]))


说明链式索引 (chained indexing)的运作

使用巢状元祖(a nested tuple)

所以,官方文件建议使用直接索引,也就是用巢状元祖(a nested tuple)的索引 B.loc[B[‘b’]==3,[‘a’]]=1 ,只需要一次运算,代码如下所示。

import pandas as pd
B = pd.DataFrame([[1,2,3],[2,3,4],[3,4,5]], columns = ['a','b','c'])
print(B)
print("B.loc[B['b']==3,['a']] = \n{}".format(B.loc[B['b']==3,['a']]))
B.loc[B['b']==3,['a']]=1
print(B)
print("B.loc[B['b']==3,['a']] = \n{}".format(B.loc[B['b']==3,['a']]))

参考来源
  • Why does assignment fail when using chained indexing?, https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  • pandas的SettingWithCopyWarning警告出现的原因和如何避免, https://blog.csdn.net/haolexiao/article/details/81180571
  • How to deal with SettingWithCopyWarning in Pandas, https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-pandas

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/943722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存