pandas警告SettingWithCopyWarning: A value is trying to ...原理和解决方案_Lucky0928的博客-CSDN博客​​​​​​ 以下内容是对这篇文章的前半部分做一个学习记录,附加我自己的一点理解与尝试。

1 SettingWithCopyWarning

SettingWithCopyWarning仅仅是一个警告 Warning,而不是错误 Error。一般情况下它是不会影响程序的运行的,但是知道如何避免SettingWithCopyWarning是很有必要的。

2 Pandas操作返回类型

Pandas中的一些操作会返回原数据,另一些操作会返回数据的副本(Copy)。

比如说我们要提取额下面DataFrame里面第一行和第二行的数据,A.loc[0:1,'A':'B']。数据有两种返回方式,一是左边的df2直接选中df1中的部分数据,二是右边的df2不对原数据df1进行修改,独立返回了一个copy。

当我们再次要对返回的内容操作,比如说要把第1行第B列的数据改成5时,A.loc[0:1,'A':'B']['B'][1]=5,这时计算机不知道到底是修改左边的df2呢还是右边的df2。

3 链式索引

SettingWithCopyWarning提示的后面还有让我们去看一个文件,里面的大致意思是引起警告的原因是我们使用了链式索引。链式索引是指连续使用多个索引操作,例如A[A.b==2]['c']。

import pandas as pd
A=pd.DataFrame({'a':[1,2,3],'b':[2,2,4],'c':[2,2,5]})
print(A)
#OutA: a  b  c
#    0  1  2  2
#    1  2  2  2
#    2  3  4  5
print(A[A.b==2])
#Out:   a  b  c
#    0  1  2  2
#    1  2  2  2
A[A.b==2]['c']=5
#<string>:1: SettingWithCopyWarning:
#A value is trying to be set on a copy of a slice from a DataFrame.
print(A)
#OutA:a  b  c
#   0  1  2  2
#   1  2  2  2
#   2  3  4  5
#再次查看A,发现A确实没有修改

这次警告是因为A[A.b==2]['c']是链式索引,简单的说该命令直接使用了两次方括号索引。

第一次索引先执行A[A.b==2],返回了一个DataFrame(不知道是会返回原数据A,还是返回A的副本B);第二次索引['c']=5是找到上一步得到的DataFrame的c列对该列赋值。

但是计算机很困惑,第一步的确生成了一个DataFrame,但是第二次修改到底是修改原数据A还是A的副本B?

从再次查看A可知第二次的赋值并没有修改原始的A,只是对A的副本B进行赋值。这种情况对应的解决方案很简单:使用loc或者iloc函数将两次链式操作简化为一步操作,确保第一次索引返回的是A。如下可以看出A被修改了

A.loc[A.b==2,'c']=4
print(A)
#Out:  a  b  c
#    0  1  2  4
#    1  2  2  4
#    2  3  4  5

除了两次方括号索引这样明显的链式索引,还有比较隐蔽的链式索引

import pandas as pd
A=pd.DataFrame({'class':[1,2,3],'name':[2,2,4],'grade':[2,2,5]})
print(A)
#Out:   class  name  grade
#    0      1     2      2
#    1      2     2      2
#    2      3     4      5
B=A.loc[A.name==A.grade]
print(B)
#Out:   class  name  grade
#    0      1     2      2
#    1      2     2      2
B.loc[0,'class']=2
print(B)
#SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a
#Out:   class  name  grade
#    0      1     2      2
#    1      2     2      2

这次使用了loc函数,依然出现了警告。因为虽然把链式索引分成了两个代码,但是B变量它依然可能是原始数据A的副本,也可能是原始数据A。这意味着当我们尝试修改B时,可能也修改了A。这种情况下的警告解决方案是:创建新数据B时明确告知 Pandas 创建一个副本.copy():

import pandas as pd
A=pd.DataFrame({'class':[1,2,3],'name':[2,2,4],'grade':[2,2,5]})
print(A)
B=A.loc[A.name==A.grade].copy()
B.loc[0,'class']=2
print(B)
#Out:class  name  grade
# 0    2     2      2
# 1    2     2      2

SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a DataFrame(Pandas库)相关推荐

  1. 成功解决SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See

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

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

    解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 在使用pand ...

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

    SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 设置拷贝警告:试图在 ...

  4. pandas模块之SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

    利用python进行数据处理的时候,经常会使用到pandas这一强大的数据处理模块.将数据存储为DataFrame形式,进行一系列的操作. 之前以及最近在处理数据的时候经常出现到的一个问题,将这个问题 ...

  5. 解决Dataframe删除操作时警告:SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a...

    完整警告为:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See ...

  6. (完全解决)Dataframe的赋值问题SettingWithCopyWarning: A value is trying to be set on a copy of a slice

    情况 sample.loc[0][1]=-1 发出警告: 其实,这个根本不是警告,而是报错.因为我发现sample的值根本没有改变. 原因 不要使用切片的方式去赋值.上面其实可以分为两步,你这种索引方 ...

  7. 成功解决pandas\core\indexing.py:179: SettingWithCopyWarning: A value is trying to be set on a copy of a

    成功解决pandas\core\indexing.py:179: SettingWithCopyWarning:  A value is trying to be set on a copy of a ...

  8. 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s

    成功解决pandas\core\frame.py:2754: SettingWithCopyWarning:  A value is trying to be set on a copy of a s ...

  9. 成功解决pandas\core\generic.py:3660: SettingWithCopyWarning:  A value is trying to be set on a copy of a

    成功解决pandas\core\generic.py:3660: SettingWithCopyWarning:  A value is trying to be set on a copy of a ...

最新文章

  1. Facebook参与AI芯片设计大混战!
  2. UPC2710T放大电路功率增益测试
  3. char,Character,int,字符及编码日记
  4. sysbench测试mysql性能(TPS、QPS、IOPS)(重要)
  5. 一个物理学家学习Windows编程的感受
  6. java护照号码校验_SpringBoot如何优雅的校验参数
  7. Visual Studio SnippetDesigner使用
  8. 自媒体平台数据统计分析爬虫系列教程文档
  9. 红外接收电路自己制作,我用过的
  10. 动物基因组测序基础分析流程总结(GWAS全流程第一部分:WGS基础流程)
  11. 给机器人罗宾写一封英语回信_人教版5年级英语unit1知识
  12. javaweb项目大概轮廓
  13. Wonderful Coloring - 2
  14. Effective C++ NVI手法
  15. 艾美捷科研专用西妥昔单抗Cetuximab相关介绍
  16. Windows 内网渗透之攻击域控
  17. ERROR:C3848
  18. FPGA开发常用软件的安装
  19. java上传视频文件到服务器,java视频上传到远程服务器
  20. 微分流形与黎曼几何学习笔记(转自http://blog.sciencenet.cn/home.php?mod=spaceuid=81613do=blogid=333317)

热门文章

  1. 终于搞清前端和后端的区别啦!原来是这样的
  2. web前端开发和后端开发哪个好?
  3. java 计算百分数问题
  4. CAD修复块中心点(网页版)
  5. 本地Windows上安装 MySQL数据库
  6. js: 字符(字母) 与 ASCII码 转换方法
  7. 2022-2028全球房地产众筹平台行业调研及趋势分析报告
  8. Cannot subclass final class org.springframework.boot.autoconfigure.AutoConfigurationPackages
  9. uva10859 Placing Lampposts
  10. WeX5 APP发布及版本升级注意事项