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

在使用pandas时遇到了一个问题:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
翻译:(你)试图改变DataFrame(类似于一个pandas向量)中的一个副本中的值
解决方法就是使用loc
执行代码如下:

import pandas as pd
import numpy as npaa=np.array([1,2,3,4])
bb=pd.DataFrame(aa.T,columns=['first'])
print(bb,'\n***********')
bb['two']=0
print(bb,'\n***********')
bb['first'][0]=3
print(bb)

输出如下:

first
0 1
1 2
2 3
3 4


first two
0 1 0
1 2 0
2 3 0
3 4 0


Warning (from warnings module):
File “D:/pProject/mlRegression/meaningless.py”, line 9
bb[‘first’][0]=3
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
first two
0 3 0
1 2 0
2 3 0
3 4 0

我们看Warning 提出的帮助文档:

也就是说,这就类似于C++中传入函数的参数只是形参,在这里是__getitem__()函数,如果你在函数中尝试改变形参是毫无意义的,python 就会发出警告。

解决方案
方案就是用它提示的loc函数

import pandas as pd
import numpy as npaa=np.array([1,2,3,4])
bb=pd.DataFrame(aa.T,columns=['first'])
print(bb,'\n***********')
bb['two']=0
print(bb,'\n***********')
#bb['first'][0]=3
bb.loc['first',0]=3#改用loc
print(bb)

loc函数保证返回的是bb本身(类似于C++的引用,而不是bb的一个副本)

再举类似一个例子

import pandas as pd
import numpy as npaa=np.array([1,2,3,4])
bb=pd.DataFrame(aa.T,columns=['first'])
bb['two']=0cc=bb.iloc[:,0]
cc[3]=13
print(bb)
print(cc)

输出结果:

Warning (from warnings module):File "D:\pProject\mlRegression\meaningless.py", line 9cc[3]=13
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrameSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyfirst  two
0      1    0
1      2    0
2      3    0
3     13    0
0     1
1     2
2     3
3    13
Name: first, dtype: int32

可以看到,警告的事情发生了!
bb的值连带着cc的值发生了改变!说明cc是bb的一个引用,cc值改变会引起bb 改变
正确做法:用深copy(而不是浅copy)

import pandas as pd
import numpy as npaa=np.array([1,2,3,4])
bb=pd.DataFrame(aa.T,columns=['first'])
bb['two']=0cc=bb.iloc[:,0]
cc=cc.copy()#加上这么一句
cc[3]=13
print(bb)
print(cc)

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

  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 设置拷贝警告:试图在 ...

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

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

  4. 解决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 ...

  5. SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a DataFrame(Pandas库)

    pandas警告SettingWithCopyWarning: A value is trying to ...原理和解决方案_Lucky0928的博客-CSDN博客​​​​​​ 以下内容是对这篇文章 ...

  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. AI 女神李飞飞最新文章:发展人工智能应该以人为本
  2. 需要我们了解的SQL Server阻塞原因与解决方法 - sym_cn
  3. ORACLE数据库实现自增的方式
  4. container_of 用法解析
  5. c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...
  6. 如何使用JavaScript检查输入是否为空
  7. 快速构建Windows 8风格应用34-构建Toast通知
  8. Spark1.0新特性--Spark SQL
  9. CIO思考:混合云为行业注入了哪些活力?
  10. 获取当前html的名字,c#获取当前页面名字
  11. php经过twemproxy无法delete后端memcache值的解决方法
  12. NETARM(NSMS)自定义万能表单系统使用说明
  13. IDEA+Java控制台实现教材管理系统
  14. Prelude CC 2019 for Mac附激活补丁 v8.1.0中文版
  15. Bit称万夫不当之勇,逆流而上。
  16. 16年9月第二周---deadline
  17. 语言本地化的救急解决方案 (非Unicode编码的程序)
  18. 解决无法删除文件夹的情况
  19. 2011款iMac的AirDrop使用方法。
  20. OpenCV-图像翻转函数cv::filp

热门文章

  1. Android中绘制圆角矩形图片及任意形状图片
  2. vi 的完整指令说明 -- YenYen 整理
  3. php checkbox多选框默认选中的实现。
  4. 《生物化学与分子生物学》----糖酵解,柠檬酸---听课笔记(十五)
  5. 川大计算机学院周激流,周激流(电子信息学院)老师 - 四川大学 - 院校大全
  6. pdf编辑器工具哪个好?好用的pdf编辑器一款就够!
  7. 中国-东盟数字经济合作有韧性前景好
  8. 大数据面试3分钟自我介绍_通用面试两分钟自我介绍范文5篇
  9. 最小公倍数用c语言,如何用C语言求最小公倍数。。。
  10. 微信小程序实现生成海报并且保存本地