Pandas 中 SettingwithCopyWarning 的原理和解决方案

2023-10-26

Pandas 中 SettingwithCopyWarning 的原理和解决方案


原文链接:https://www.dataquest.io/blog/settingwithcopywarning/
原文标题:Understanding SettingwithCopyWarning in pandas
原文发布时间:5 JULY 2017(需要注意时效性,文中有一些方法已经弃用,比如 ix)

学习 Python 数据分析的同学总是遇到这个警告,查询中文资料,一般只能找到个别的解决办法,不一定适用于自己遇到的情况。查到的最常见解决办法就是直接设置为不显示警告。这实际上并不能解决问题,搜索资料发现这篇英文讲解 SettingWithCopyWarning原理非常系统的文章,翻译了一下,分享给大家。

太长不看

  • 解决方案:学会识别链式索引,不惜一切代价避免使用链式索引

    注意:如果你看不懂这里的解决方案,请阅读此文前半部分,直到真正理解如何去做

    • 如果要更改原始数据,请使用单一赋值操作(loc):
    data.loc[data.bidder == 'parakeet2004', 'bidderrate'] = 100
    
    • 如果想要一个副本,请确保强制让 Pandas 创建副本:
    winners = data.loc[data.bid == data.price].copy() 
    winners.loc[304, 'bidder'] = 'therealname'
    
  • 强烈不推荐直接关闭警告,不过还是提供一下关闭警告的设置方法:

pd.set_option('mode.chained_assignment', None)
  • 深度解析底层代码和历史演变(可选阅读)

img

题图

SettingWithCopyWarning 是人们在学习 Pandas 时遇到的最常见的障碍之一。搜索引擎可以搜索到 Stack Overflow 上的问答、GitHub issues 和一些论坛帖子,分别提供了该警告在某些特定情况下的含义。会有这么多人同样遇到这个警告并不奇怪:有很多方法可以索引 Pandas 数据结构,每种数据结构都有各自的细微差别,甚至 Pandas 本身并不能保证两行代码的运行结果看起来完全相同。

本指南包含了生成警告的原因及解决方案,其中还包括一些底层细节,让你更好地了解代码内部的运行机制,最后提供了有关该话题的一些历史情况,解释代码底层以这样的方式运行的原因。

为了探索 SettingWithCopyWarning,我们将使用 eBay 3 天拍卖出售的 Xbox 的价格数据集,该数据集出自 Modelling Online Auctions 一书。先来了解下数据的基本结构:

import Pandas as pd

data = pd.read_csv('xbox-3-day-auctions.csv')
data.head()
auctionid bid bidtime bidder bidderrate openbid price
0 8213034705 95.0 2.927373 jake7870 0 95.0 117.5
1 8213034705 115.0 2.943484 davidbresler2 1 95.0 117.5
2 8213034705 100.0 2.951285 gladimacowgirl 58 95.0 117.5
3 8213034705 117.5 2.998947 daysrus 10 95.0 117.5
4 8213060420 2.0 0.065266 donnie4814 5 1.0 120.0

如你所见,数据集的每一行都是某一次 eBay Xbox 出价信息。下面是对数据集中每列的简要说明:

  • auctionid - 每次拍卖的唯一标识符
  • bid - 本次拍卖出价
  • bidtime - 拍卖的时长,以天为单位,从投标开始累计
  • bidder - 投标人的 eBay 用户名
  • bidderrate - 投标人的 eBay 用户评级
  • openbid - 卖方为拍卖设定的开标价
  • price - 拍卖结束时的中标价

什么是 SettingWithCopyWarning?

首先要理解的是,SettingWithCopyWarning 是一个警告 Warning,而不是错误 Error。

错误表明某些内容是“坏掉”的,例如无效语法(invalid syntax)或尝试引用未定义的变量;警告的作用是提醒编程人员,他们的代码可能存在潜在的错误或问题,但是这些操作在该编程语言中依然合法。在这种情况下,警告很可能表明一个严重但不容易意识到的错误。

SettingWithCopyWarning 告诉你,你的操作可能没有按预期运行,需要检查结果以确保没有出错。

如果代码确实按预期工作,那么我们会很容易忽略该警告,但是 SettingWithCopyWarning不应该被忽略。在进行下一步操作之前,我们需要花点时间了解这一警告显示的原因。

要了解 SettingWithCopyWarning,首先要知道,Pandas 中的某些操作会返回数据的视图(View),某些操作会返回数据的副本(Copy)。

img

View VS Copy

如上所示,左侧的视图 df2 只是原始数据 df1 一个子集,而右侧的副本创建了一个新的对象 df2

当我们尝试对数据集进行更改时,这可能会出现问题:

img

修改视图或副本

根据需求,我们可能想要修改原始 df1(左),也可能想要修改 df2(右)。警告让我们知道,代码可能并没有符合需求,修改到的可能并不是我们想要修改的那个数据集。

稍后会深入研究这个问题,但是现在先来了解一下,警告出现的两个主要原因以及对应的解决方案。

链式赋值(Chained Assignment)

当 Pandas 检测到链式赋值(Chained Assignment)时会生成警告。为了方便后续的解释,先来解释一些术语:

  • 赋值(Assignment) - 设置某些变量值的操作,例如 data = pd.read_csv('xbox-3-day-auctions.csv') ,有时会将这个操作称之为 设置(Set)
  • 访问(Access) - 返回某些值的操作,具体参照下方的索引和链式索引示例。有时会将这个操作称之为 获取(Get)
  • 索引(Indexing) - 任何引用数据子集的赋值或访问方法,例如 data[1:5]
  • 链式索引(Chaining) - 连续使用多个索引操作,例如data[1:5][1:3]

链式赋值是链式索引和赋值的组合。先快速浏览一下之前加载的数据集,稍后将详细介绍。在这个例子中,假设我们了解到用户 'parakeet2004'bidderrate 值不正确,需要修改这个 bidderrate 值,那么先来查看一下用户 'parakeet2004' 的当前值:

data[data.bidder == 'parakeet2004']
auctionid bid bidtime bidder bidderrate openbid price
6 8213060420 3.00 0.186539 parakeet2004 5 1.0 120.0
7 8213060420 10.00 0.186690 parakeet2004 5 1.0 120.0
8 8213060420 24.99 0.187049 parakeet2004 5 1.0 120.0

有三行数据需要更新 bidderrate 字段,继续操作:

data[data.bidder == 'parakeet2004']['bidderrate'] = 100
/Library/Frameworks/Python.framework/Versions/36/lib/python3.6/ipykernel/__main__.py:1:SettingWithC
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 中 SettingwithCopyWarning 的原理和解决方案 的相关文章

随机推荐

  • C# 数组 Array foreach 索引 null

    地址 http www cnblogs com txw1958 archive 2013 01 11 csharp array html 数组概述 数组是一种数据结构 它包含若干相同类型的变量 数组是使用类型声明的 数组具有以下属性 数组可
  • IE8兼容

    X UA Compatible是针对ie8新加的一个设置 对于ie8之外的浏览器是不识别的 这个区别与 content IE 7 在无论页面是否包含指令 都像是使用了 Windows Internet Explorer 7的标准模式 而co
  • 并行计算—0—Windows下环境配置CUDA与Visual Studio2017

    原料 1 Visual Studio2017 https visualstudio microsoft com zh hans downloads 先装这个 2 CUDA Toolkit 9 2 https developer nvidia
  • S7-1200/S7-1500与S7-300进行S7通信

    我们使用的是1200 1500作为客户端 300作为服务端 1 需要确认S7 300PLC是否设置了允许远程读取 随便找个组态软件读取一下看看能否正确读取 2 确认是否两个程序属于同一个项目 如果不属于同一个项目使用手册中的第3 4方式 比
  • Spring Boot 实践 第六章 Spring data JAP在实际开发中的封装和应用(上)

    上一章简单介绍了一下Spring boot和Spring Data JPA的整合和简单使用 但是在实际开发过程中 我们发现Spring Data JPA提供的接口太简单了 这样就导致需要编写大量的重复代码 实际上Spring Data JP
  • 用python做Cox分析的三个库的介绍和体验

    用python做Cox分析的三个常见库的介绍和体验 跟时间相关的数据分析 预测模型 一个是时间序列 X随时间变化 另外一个就是Cox y随时间变化 都有专门的包 statsmodel lifelines和scikit survival 是p
  • c语言测试程序执行时间

    http blog csdn net asaasa66 article details 6543929 测试程序运行时间 time h 1 计时 C C 中的计时函数是clock 而与其相关的数据类型是clock t 在MSDN中 查得对c
  • 利用锁机制解决商品表和库存表并发问题

    锁机制 问题 当一个脚本被一个客户端访问都正常 但当多个客户端同时并发访问时 这个脚本的结果会出现不正确 这个问题需要使用锁机制来解决 在我们这个网站中需要用到锁的地方就是高并发下定单时减少商品库存量时 比如例子1 有一个A 表里面一个ID
  • 两台电脑直接使用一根网线传输文件

    教程 目录 https blog csdn net dkbnull article details 87933584 有时候我们需要在两台电脑之间传输几十G的大文件 或者置换新电脑时复制文件到新电脑 而我们身边又没有移动硬盘 就可以考虑使用
  • 页面中引入高德地图

    一 打开高德开放平台网站https lbs amap com 点击右上角注册 如下图所示 二 按要求填写注册信息 三 注册完成之后 进入控制台 点击右上角 创建新应用 名称随便写 如下图所示 四 在应用右上角点击 添加 新增key 五 将新
  • ES6知识点总结三:数组的扩展(扩展运算符···、Array.from()、Array.of()...)

    4 数组扩展之扩展运算符 扩展运算符 spread 是三个点 它好比 rest 参数的逆运算 将一个数组转为用逗号分隔的参数序列 var arr 1 2 3 9 8 arr 9 8 1 2 3 a 1 2 3 a 1 2 空数组不会有有变化
  • 赞!一篇博客讲解清楚 Python queue模块,作为Python爬虫预备知识,用它解决采集队列问题

    Queue 模块 只要涉及到多线程爬虫 就会涉及到数据采集队列的优先级问题 在 Python 中 Queue 模块提供了一个同步的 线程安全的队列类 它包括常见的 FIFO 先入先出 LIFO 后入先出 PriorityQueue 按优先级
  • 【JAVA】代码规范

    一 命名规约 1 强制 所有编程相关命名均不能以下划线或美元符号开始 也不能以下划线或美元符号结束 反例 name name Object name name Object 2 强制 类名使用UpperCamelCase风格 必须遵从驼峰形
  • 计算机传输速率127,计算机基础知识2

    3 提高可靠性 计算机网络中的各台计算机可以通过网络互相设置为后备机 一旦某台计算机出现故障时 网络中的后备机即可代替继续执行 保证任务正常完成 避免系统瘫痪 从而提高了计算机的可靠性 4 分担负荷 当网上某台计算机的任务过重时 可将部分任
  • visjs 数据的增删改筛选(DataSet & DataView)

    visjs中的 DatatSet 用于数据的保存 可操作非结构化数据 并可监听数据的变化 DataSet构造 var data new vis DataSet data options 构造后 可通过 add updateOnly upda
  • Pandas知识点-DataFrame数据结构介绍

    Pandas知识点 DataFrame数据结构介绍 一 Pandas简介和安装 Pandas是Python中用于数据处理和数据分析的开源库 2008年由金融数据分析师Wes McKinney开发 开发Pandas的初衷是为了方便进行金融数据
  • 如何在pycharm中使用git

    一 环境配置 1 下载安装git 安装成功后 打开git bash here输入以下命令配置基础信息 git config global user name 用户名 git config global user name 邮箱地址 输入命令
  • 关于配置Golang语言环境中的一些问题以及配置yum源的方法

    关于配置Go语言环境中的一些问题 坚持不做无用的 重复的 混字数的博客 所以主要谈及安装使用过程中遇到的问题 具体安装参考博客 https pmlpml github io ServiceComputingOnCloud ex instal
  • SpringBoot中注入RedisTemplate报空指针

    现象 RedisTemplate不能作为静态变量注入 否则报空指针 错误做法 private static RedisTemplate
  • Pandas 中 SettingwithCopyWarning 的原理和解决方案

    Pandas 中 SettingwithCopyWarning 的原理和解决方案 原文链接 https www dataquest io blog settingwithcopywarning 原文标题 Understanding Sett