(想要直接解决问题的请直接拉到最后)

使用的DataFrame的

  year state pop debt
one 2000 Ohio 1.5 NaN
two 1000 Ohio 1.7 1000
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7

当使用 frame2['year']['two'] = 10000, 即df名[列名][行名]的方式去赋值就会报错, 提示如下

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

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

进入提示网页, 查找与SettingWithCopyWarning有关部分, 这里简单翻译了一下(渣翻译, 推荐大家去看原文, 在最后几部分里)

chained indexing

这就是出现警告的原因, 我们在使用pandas中要极力避免出现chained index)

下面是一个例子解释到底什么是chained indexing

 In [4]: dfmi = pd.DataFrame([list('abcd'), list('efgh'), list('ijkl'), list('mnop')],...:                     columns=pd.MultiIndex.from_product([['one', 'two'], ['first', 'second']]))...:In [5]: dfmiOut[5]:one          twofirst second first second0     a      b     c      d1     e      f     g      h2     i      j     k      l3     m      n     o      p

我们通过两种不同的方式去访问同一值

 #第一种方式In [6]: dfmi['one']['second']Out[6]:0    b1    f2    j3    nName: second, dtype: object#第二种方式In [7]: dfmi.loc[:,('one', 'second')]Out[7]:0    b1    f2    j3    nName: (one, second), dtype: object

可以看出虽然访问方式不同, 但是返回的结果是相同的. 相同结果, 但其实第二种访问方式应该是我们所推荐使用的, 原因如下

第一种访问方式

使用dfmi['one']['second']其实是分为两个独立事件完成的, 一个事情接着一件事情发生:

第一步 执行dfmi['one']

第二步 在第一步的基础上执行dfmi_with_one['second'], 相当于在第一步返回Series基础上, 检索索引['second']

看似是一步到位的访问, 其实在内部调用了两次__getitem__

第二种方式访问

fmi.loc[:,('one', 'second')] 相当于将一个嵌套的元组(slice(None), ('one', 'second'))传递给一个__getitem__, 这就使得pandas将其作为一个整体来处理, 第二种方式比第一种方式速度更快


这里的第一种访问方式就是chained indexing, 接下来解决为什么chained indexing会造成警告.

     #第二种访问方式(推荐方式)dfmi.loc[:, ('one', 'second')] = value#其实在编译器中是这样操作的dfmi.iloc.setitem((slice(None), ('one', 'second')), value)#但是这一段代码编译器处理就很不同了#第一种访问方式chained indexingdfmi['one']['second'] = value#其实在编译器中是这样操作的dfmi.__getitem__('one').__setitem__('second', value)

问题的关键就出在这里的__getitem__上, 因为我们很难预测到这里的__getitem__返回的是一个视图或是一个copy, 因为我们无法确定__setitem))修改的到底是真实的dfmi或是暂时的copy副本, 这就是SettingWithCopy想要警告我们的.

到此问题就算是解决了, 出现警告的原因在于无法预测到底修改的是视图还是副本.

注意

dfmi.loc保证是dfmi本身伴随修改索引行为(这句话有点不太通顺, 大家可以去看看原文, 重点是后面一句), 所以dfmi.loc.__getitem__和dfmi.loc__setitem__方法一定是直接作用在dfmi上的. 当然dfmi.loc.__getitem__(idx)就无法预测到时作用在视图上或是副本上了.

另一种会出现这种警告的情形, 虽然这里并没有明显的链式索引.

 In [9]: def do_something(df):...:     foo = df[['bar', 'baz']]...:     #对于foo是视图或是副本, 其实我们是无法得知的...:     foo['quux'] = value...:     return foo

解决警告的方案:

使用 DafaFrameming.loc[行名, 列名] = 值 的方式去赋值, 而不是使用DataFrame[][]的形式去赋值.

Pandas - 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(Pandas库)

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

  2. pandas 报警告:A value is trying to be set on a copy of a slice from a DataFrame

    pandas 报警告:A value is trying to be set on a copy of a slice from a DataFrame 我在抽取了原来DataFrame数据的几列后, ...

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

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

  4. pandas使用set_table_attributes函数、display_html函数等在jupyter notebook中并排显示两个dataframe的内容(side by side)

    pandas使用set_table_attributes函数.display_html函数等在jupyter notebook中并排显示两个dataframe的内容(side by side) 目录

  5. pandas中series一维数组的创建、索引的更改+索引切片和布尔索引+dataframe二维数组的创建、基本属性、索引方法(传统方法和lociloc)、nan操作、排序+案例

    目录 一.为什么要学习pandas? 二.pandas的常用数据类型 1.series--一维的且带标签的数组 (1)创建一维数组 (2)通过列表形式创建的series带标签数组可以改变索引,传入索引 ...

  6. python Pandas SettingwithCopy 警告解决方案

    原文链接:https://www.dataquest.io/blog/settingwithcopywarning/ 原文标题:Understanding SettingwithCopyWarning ...

  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. java switch 应用
  2. C语言中| 按位或, || 逻辑或。
  3. 动态规划(最长递增子序列)---最长递增子序列
  4. Divan and Kostomuksha (H version) dp,gcd(2300)
  5. Nodejs模块、自定义模块、CommonJs的概念和使用
  6. Find consecutive elements in an array
  7. 290. Word Pattern
  8. Linux进程间通信(管道、消息队列、共享内存、信号、信号量)
  9. Fedora/CentOS7/RedHat7关闭图形桌面开启文本界面
  10. 写一篇文章需要多长时间?
  11. JavaSE学习笔记--Item1 注解Annotation
  12. dreamweaver序列号免费_dreamweaver8【dreamweaver8序列号】dreamweaver8注册码序列号简体中文版...
  13. URPF - 单播逆向路径转发
  14. Ubuntu系统搭建Discus论坛
  15. Connext DDSQoS参考
  16. Matlab实现小波变换
  17. html在线编辑器代码运行,JSRun - 在线JS、HTML编辑器(同时也支持各种后台代码的编辑运行)...
  18. HDOJ--2022
  19. python空气质量指数计算_现在,哪个城市的空气最好闻?空气质量指数分布图——Python实例...
  20. sin(1/x)的图像,第二类间断点,震荡间断点

热门文章

  1. 基于深度学习的车辆信息识别(一):车辆颜色识别
  2. Spring Boot入门教程(四十):微信支付集成-刷卡支付
  3. 自制月球灯第一期之无线充电篇
  4. 开启大功率无线充电新时代
  5. Linux下硬盘加密
  6. 小程序学习 - 02 微信小程序案例实践
  7. Mac OS X 键盘字母键和数字键的切换
  8. 编程小技巧之 Linux 文本处理命令(二)
  9. 关于Navicat Premium连接Oracle数据库闪退(失败)的解决办法(带ocl.dll)
  10. linux 安装守护进程supervisor