[python学习笔记] - Pandas的SettingwithCopy分析

2023-11-13

警告信息

当我尝试修改dataframe或者对其赋值时,出现了警告信息:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandasdocs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

分析

首先要明确,这是个警告而不是错误。是提醒你这段代码执行的结果可能不符合你的预期。
可以强行关闭警告,眼不见为净(不推荐):
pd.set_option('mode.chained_assignment', None)

  • raise - 抛出异常(exception)而不是警告
  • warn - 生成警告(默认)
  • None - 完全关闭警告

官方文档里有几个概念:

  1. Assignment,set,赋值。
  2. Access,get,取值。
  3. 索引(Indexing。任何引用数据子集的赋值或访问方法,例如 data[1:2]
  4. 链式索引(Chaining)。连续使用多个索引操作,例如data[1:2][1:2]
  5. Chained Assignment,链式赋值就是链式索引+赋值的组合。
  6. Hidden Chaining,隐式链式。
  7. view,视图,也可以理解为切片,slice。
  8. copy,副本,与原数据没有任何关联,存储在新的内存地址。

在这里插入图片描述

Chained Assignment

请细品:

import pandas as pd
df = pd.DataFrame({"A":range(5), "B":range(5)})
# df
#    A  B
# 0  0  0
# 1  1  1
# 2  2  2
# 3  3  3
# 4  4  4
# try to set df[4, "B"] = 100

# method-1
df[df.A == 4]["B"] = 100
# 触发了1次SettingWithCopyWarning
# 第一个链式get,返回dataframe。
# 第二个链式set,在返回的datafram上修改。

# method-2
df.loc[df.A == 4, "B"] = 100
# df修改成功
# 使用loc将链式操作合并

# method-3
df["B"][df.A == 4] = 100
# df修改成功

lociloc来赋值可以避免链式赋值造成的警告和错误。

Hidden Chaining

有些时候,很多以为不是链式操作的代码其实是隐式链式。
请细品:

import pandas as pd
df = pd.DataFrame({"A":range(5), "B":range(5)})
# df
#    A  B
# 0  0  0
# 1  1  1
# 2  2  2
# 3  3  3
# 4  4  4

df1 = df[df.A >= 2] # view
df2 = df[df.A >= 2].copy() # copy
#   A  B
#2  2  2
#3  3  3
#4  4  4

# method-1.1
df1[df1.A == 4]["B"] = 100
# 触发了1次SettingWithCopyWarning

# method-1.2
df1.loc[df1.A == 4, "B"] = 100
# 触发了2次SettingWithCopyWarning

# method-1.3
df1["B"][df1.A == 4] = 100
# 触发了1次SettingWithCopyWarning

# method-2.1
df2[df2.A == 4]["B"] = 100
# 触发了1次SettingWithCopyWarning

# method-2.2
df2.loc[df2.A == 4, "B"] = 100
# 修改成功

# method-2.3
df2["B"][df2.A == 4] = 100
# 修改成功

由于df1df的视图,所以对df1的赋值仍要修改df,所以就变成了通过view的方式达隐式的实现了Chained Assignment。

链式操作,底层代码涉及到__getitem____setitem__,等价于:

df[df.A == 4]["B"] = 100
df.__getitem__(df.__getitem__('A') == 4).__setitem__('B', 100)
# df.__getitem__(df.__getitem__('A') == 4)为主体,调用__setitem__()

df.loc[df.A == 4, "B"] = 100
df.loc.__setitem__((df.__getitem__('A') == 4, 'B'), 100)
# df.loc为主体,调用__setitem__()

df["B"][df.A == 4] = 100
df.__getitem__('B').__setitem__(df.__getitem__('A') == 4, 100)
# df.__getitem__('B')为主体,调用__setitem__()
False negatives

详细分析见文末的参考链接。

结语

目前的分析只是皮毛,最有效的还是看官方文档,涉及到很多底层的实现。
后续会继续补全。

https://zhuanlan.zhihu.com/p/41202576 《Pandas SettingwithCopy 警告解决方案》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[python学习笔记] - Pandas的SettingwithCopy分析 的相关文章

  • 如何在Python中测量时间?

    我想启动我的程序 测量程序启动的时间 然后等待几秒钟 按下按钮 K RIGHT 并测量按下按钮的时间 我正在使用 Pygame 来注册 Keydown 但在我下面的代码中它没有注册我的 Keydown 我在这里做错了什么 start tim
  • 在python的telnetlib中检测关闭的连接

    我正在使用 python 的telnetlib http docs python org library telnetlib html连接到远程 telnet 服务器 我很难检测连接是否仍然打开 或者远程服务器是否将其关闭 下次我尝试读取或
  • 如何在Python和C++之间交换数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想用 Python 编写一个程序 读取 2 个数字 从文本文件或用户输入 调用一个接受 2 个参数 这 2 个数字 的 C 函数 将
  • 在Python中从字符串中删除除字母数字字符之外的所有内容

    使用 Python 从字符串中去除所有非字母数字字符的最佳方法是什么 中提出的解决方案这个问题的 PHP 变体 https stackoverflow com questions 840948可能会进行一些小的调整 但对我来说似乎不太 Py
  • 使用 xlwings 排序(pywin32)

    我需要使用 python 按给定行对 Excel 电子表格进行排序 为了进行测试 我使用以下数据 在名为 xlwings sorting xlsx 的文件中 Numbers Letters Letters 2 7 A L 6 B K 5 C
  • Networkx - 最短路径长度

    我在用着networkx管理由 50k 个节点组成的大型网络图 我想计算一组特定节点 例如 N 之间的最短路径长度 为此我正在使用nx shortest path length功能 在 N 的某些节点中可能没有路径 因此 networkx
  • Sendmail Errno[61] 连接被拒绝

    我一直在尝试让我的应用程序将一些输出的文本邮寄到电子邮件中 为了简单起见 我隔离了脚本 import smtplib import sys import os SERVER localhost FROM os getlogin TO raw
  • 在 Mac 上运行 Tkinter

    我是一个绝对的新手 我正在尝试为我的学校项目制作 Python GUI 所以我决定使用 Tkinter 当我尝试导入 Tkinter 时 它会抛出以下消息 gt gt gt import tkinter Traceback most rec
  • 使用 imaplib 库连接到电子邮件时遇到 AUTHENTICATIONFAILED 错误

    如何连接到 imaplib 库而不遇到 AUTHENTICATIONFAILE 错误 通过网络浏览器登录时 我的 Gmail 收件箱显示严重的安全警报 登录尝试被阻止 IMAP SERVER imap gmail com USERNAME
  • scikit-learn 使用的 CART 算法是确定性的吗?

    我从 scikit learn 网站获得以下代码 import numpy as np from sklearn datasets import load iris from sklearn model selection import c
  • manage.pysyncdb 不会为某些模型添加表

    今天我的第二个不太熟练的问题 我有一个 django 项目 其中安装了四个应用程序 当我运行manage py syndb时 它只为其中两个创建表 据我所知 我的任何模型文件都没有问题 并且所有应用程序都在我的设置文件中的 INSTALLE
  • Python 有限边界 Voronoi 单元

    我正在尝试改编我在 stackoverflow 上找到的代码来创建具有有限边界的 voronoi 单元 我发现下面的代码https stackoverflow com a 20678647 2443944 https stackoverfl
  • 无法在 VS Code 中导入

    我是 python 新手 一直在使用 VS code 现在我正在研究汤普森采样问题 需要 numpy 和 matplotlib 我已经导入了这两个库 但 VS code 给出了无法导入的错误 我知道我必须使用 PIP 进行安装 并且我已经看
  • 与 CPython、Jython 和 IronPython 相比,PyPy 能提供什么?

    从我在博客上看到和读到的内容来看 PyPy 是一个非常雄心勃勃的项目 与它的兄弟姐妹 CPython Jython 和 IronPython 相比 它会带来哪些优势 是速度 跨平台兼容性 包括移动平台 在没有 GIL 的情况下使用 c 扩展
  • 如何为 PyDev 制作文件模板?

    我希望在我创建的每个新文件的顶部都有一些有关许可证 作者等的样板信息 但我找不到要勾选的正确框 基本上 我想创建一个新文件 并已将其填充 在顶部 author Me license something copyright something
  • python中使用argsort进行排序

    我尝试对数组进行排序 import numpy as np arr 5 3 7 2 6 34 46 344 545 32 5 22 print unsorted print arr np argsort arr print sorted p
  • Python 类中的继承顺序

    我有课ExampleSim它继承自基类Physics class Physics object arg1 arg1 def physics method print physics method class ExampleSim Physi
  • Pandas .apply() 函数中的异常处理

    如果我有一个数据框 myDF DataFrame data 11 11 22 2A 33 33 columns A B 给出以下数据帧 从 stackoverflow 开始 对于数据帧的图像没有足够的声誉 A B 0 11 11 1 22
  • 一旦相关命令更改,如何自动运行 py.test?

    通过autonose或nosy 一旦某些测试文件或相关文件发生更改 它将自动运行nosetests 请问py test是否提供了类似的功能 有没有其他工具可以自动激发py test 您可以安装pytest xdist 插件 http pyp
  • 以任意深度嵌套 defaultdict

    我想嵌套任意数量的默认字典 如下所示 from collections import defaultdict D defaultdict lambda defaultdict int 正如所描述的那样工作正常earlier https st

随机推荐

  • python爬取猎聘网数据并且存入数据库

    目前我还是爬虫小白 只是会简单通过解析网页数据来保存 还不会模拟登陆 ip代理等技巧 这边只是爬取静态网页 对于动态生成的内容 我就没折了 由于最近工作比较忙就没有进一步学习高级爬虫技巧 大伙先勉强看着 后面学会了 给大家分享高级技巧 代码
  • 【漏洞真实影响分析】Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)

    系列简介 漏洞真实影响分析是墨菲安全实验室针对热点漏洞的分析系列文章 帮助企业开发者和安全从业者理清漏洞影响面 梳理真实影响场景 提升安全应急响应和漏洞治理工作效率 漏洞概述 Apache Kafka Connect服务在2 3 0 至 3
  • HTML入门案例Demo【猫咪相册】

    案例代码
  • Android postTranslate和preTranslate的理解

    matrix setScale interpolatedTime interpolatedTime matrix preTranslate centerX centerY matrix postTranslate centerX cente
  • 调用libcurl实际操作以及libcurl函数介绍

    目录 一 基本的http GET POST操作 二 头文件和库bug解决 复习 2 1找不到头文件如何解决 2 2找不到函数 2 3环境变量配置 三 libcurl函数介绍 3 1curl easy setopt函数部分选项介绍 3 2 c
  • Office Visio 2013安装

    哈喽 大家好 今天一起学习的是Visio 2013的安装 这是一个绘制流程图的软件 用有效的绘图表达信息 比任何文字都更加形象和直观 Office Visio 是office软件系列中负责绘制流程图和示意图的软件 便于IT和商务人员就复杂信
  • TokuDB性能测试报告

    作者介绍 吴双桥 腾讯云数据库工程师 本文首发腾云阁 TokuDB性能测试报告 一 背景介绍 近年来 TokuDB作为MySQL的大数据 Big Data 存储引擎受到人们的普遍关注 其架构的核心基于一种新的叫做分形树 Fractal Tr
  • 区块链技术概述

    什么是区块链 最通俗易懂的解释 哔哩哔哩 bilibili 区块链是随着比特币等数字加密货币的日益普及而逐渐兴起的一种全新的去中心化基础架构与分布式计算范式 区块链技术具有去中心化 时序数据 集体维护 可编程和安全可信等特点 特别适合构建可
  • 梅克尔树Merkle trees是什么?(以太坊)

    http www btckan com news topic 14827 梅克尔树 Merkle trees 是区块链的基本组成部分 虽说从理论上来讲 没有梅克尔树的区块链当然也是可能的 你只需创建直接包含每一笔交易的巨大区块头 block
  • 研究查阅资料所用到的网站备份

    1 liberary genesis http libgen is 免费下载各种论文 英文原版书 2 semantic scholar https www semanticscholar org 可查询英文论文的影响因子 引用信息 可根据一
  • ES6标准

    ECMAScript 6 0 以下简称 ES6 是 JavaScript 语言的下一代标准 前端es6是模块化开发 es6模块化规范就是浏览器端与服务器端通用的模块化开发规范 其中定义了每一个JavaScript文件都是一个独立的模块 导入
  • mysql 中null和default null,char和varchar,int和integer区别

    default null 和null 区别 default null 指的是 默认值为null int和integer 区别 int和integer 没有区别 char和varchar 区别 char和varchar都是用来存储字符串的 但
  • elementUI-dropdown点击非按钮区域,弹出下拉框

    如下代码 设计到的知识点 dropdown下拉框 点击按钮弹出 点击图片也要弹出 涉及到 js触发按钮点击事件 function load document getElementById target click 一行5个li 随之屏幕的宽
  • redis整体删除,整个hash删除,批量删除,单个删除,正则删除

    对于redis的hash数据结构的删除 pool redis ConnectionPool host 127 0 0 1 port 6381 db 0 decode responses True r redis Redis connecti
  • stm32通过I2C实现温湿度(AHT20)采集

    文章目录 一 环境配置 二 I2C总线通信协议 1 I2C介绍 2 I2C物理层 3 I2C协议层 4 软件IIC和硬件IIC 三 实现AHT20采集程序 1 硬件连接 2 代码实现 四 效果展示 五 总结 六 参考资料 一 环境配置 软件
  • 【LeetCode刷题】 27 移除元素 -java

    题目 给你一个数组 nums 和一个值 val 你需要 原地 移除所有数值等于 val 的元素 并返回移除后数组的新长度 不要使用额外的数组空间 你必须仅使用 O 1 额外空间并 原地 修改输入数组 元素的顺序可以改变 你不需要考虑数组中超
  • Axure插件axure-chrome-extension安装

    chrome浏览器打开axure生成的HTML静态文件页面预览打开如下图显示 这是因为chrome浏览器没有安装Axure插件axure chrome extension导致的 方式一 先下载Axure谷歌浏览器插件 然后在浏览器中添加扩展
  • 使用charles map remote host

    应用场景 a 某个后端Dev在他本地分支有一些代码改动 Bug fix 在未部署的情况下 通过remote map可以提前测试验证其个人分支 b APP进入prod测试阶段 有一些H5页面Prod环境一经部署会直接影响线上用户 因此H5 前
  • 锤子手机系统位置服务器,两种锤子系统安装方法【图文详解】

    很多用安卓手机的人都知道 锤子 系统界面和其他 苹果 和安卓系统的界面是不一样的 锤子 系统界面应用在安卓手机上显示的是重新画的应用图标 整体上还是很好看的 完全比的上苹果系统界面 大家如果看烦了安卓原桌面不防去刷个锤子系统来玩玩 下面我告
  • [python学习笔记] - Pandas的SettingwithCopy分析

    警告信息 当我尝试修改dataframe或者对其赋值时 出现了警告信息 A value is trying to be set on a copy of a slice from a DataFrame Try using loc row