pandas链式操作与SettingWithCopyWarning详解

news2025/3/14 10:41:23

1.SettingWithCopyWarning问题

SettingWithCopyWarning是pandas中一个经典问题,也是pandas库中位数不多的坑之一。关于这个问题,我们先看下面的一个例子。

import pandas as pd


def t1():
    data = {
        'name': ['a', 'b', 'c', 'd', 'e', 'f'],
        'num': [1, 2, 3, 4, 5, 6],
        'ss': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
    }
    df = pd.DataFrame(data)
    print(df, "\n")
    df[df['name'] == 'a']['num'] = 10
    print(df)

上面的代码本意,是想将df中name为’a’的行中,num赋值为10。我们看一下代码运行的结果:

  name  num   ss
0    a    1  0.1
1    b    2  0.2
2    c    3  0.3
3    d    4  0.4
4    e    5  0.5
5    f    6  0.6 

/Users/wanglei/wanglei/code/python/finance-trade/p2/DfCopyCode.py:19: SettingWithCopyWarning: 
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/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df[df['name'] == 'a']['num'] = 10
  name  num   ss
0    a    1  0.1
1    b    2  0.2
2    c    3  0.3
3    d    4  0.4
4    e    5  0.5
5    f    6  0.6

首先代码给出了SettingWithCopyWarning的告警。注意是Warning,而不是Error。
然后我们观察输出,发现赋值并没有起到预期的效果,df的值没有发生变化。

具体原因在哪里?
要了解 SettingWithCopyWarning,首先要知道,Pandas 中的某些操作会返回数据的视图(View),某些操作会返回数据的副本(Copy)。

在这里插入图片描述
如上所示,左侧的视图 df2 只是原始数据 df1 一个子集,而右侧的副本创建了一个新的对象 df2。

当我们尝试对数据集进行更改时,这可能会出现问题:
在这里插入图片描述
根据需求,我们可能想要修改原始 df1(左),也可能想要修改 df2(右)。警告提醒我们,代码可能并没有符合需求,修改到的可能并不是我们想要修改的那个数据集。
(该部分图文来自参考文献1)

如何解决上面的问题?其实在SettingWithCopyWarning中已经给出了答案,使用loc。

def t2():
    data = {
        'name': ['a', 'b', 'c', 'd', 'e', 'f'],
        'num': [1, 2, 3, 4, 5, 6],
        'ss': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
    }
    df = pd.DataFrame(data)
    df.loc[df['name'] == 'a', 'num'] = 10
    print(df)

上面方法的输出为

  name  num   ss
0    a   10  0.1
1    b    2  0.2
2    c    3  0.3
3    d    4  0.4
4    e    5  0.5
5    f    6  0.6

这样就达到了我们预期的目的。

为什么loc方法能保证达到预期?具体可以查阅参考文献1,解释得非常清楚详细。

2.跨行的SettingWithCopyWarning问题

下面我们再来看一个例子

def t3():
    data = {
        'name': ['a', 'b', 'c', 'd', 'e', 'f'],
        'num': [1, 2, 3, 4, 5, 6],
        'ss': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
    }
    df = pd.DataFrame(data)
    subdf = df.loc[df.num <= 3]
    print(subdf)

    subdf.loc[subdf['name'] == 'a', 'num'] = 10
    print(subdf)

上面代码的输出为

  name  num   ss
0    a    1  0.1
1    b    2  0.2
2    c    3  0.3
/Users/wanglei/anaconda3/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py:965: SettingWithCopyWarning: 
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/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[item] = s
  name  num   ss
0    a   10  0.1
1    b    2  0.2
2    c    3  0.3

我们看赋值已经成功了,subdf已经进行了改变,也使用了loc的方式进行复制,为什么还会有SettingWithCopyWarning告警呢?
链式索引可能在一行代码内发生,也可能跨越两行代码。因为subdf变量是作为 Get 操作的输出创建的,它可能是原始 DataFrame 的副本,也可能不是,除非检查,否则我们不能确认。对subdf进行索引时,实际上使用的就是链式索引。

这种情况下的警告解决方案是:创建新 DataFrame 时明确告知 Pandas 创建一个副本 (来自参考文献1)

def t4():
    data = {
        'name': ['a', 'b', 'c', 'd', 'e', 'f'],
        'num': [1, 2, 3, 4, 5, 6],
        'ss': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
    }
    df = pd.DataFrame(data)
    subdf = df.loc[df.num <= 3].copy()
    print(subdf)

    subdf.loc[subdf['name'] == 'a', 'num'] = 10
    print(subdf)

代码的输出为:

  name  num   ss
0    a    1  0.1
1    b    2  0.2
2    c    3  0.3
  name  num   ss
0    a   10  0.1
1    b    2  0.2
2    c    3  0.3

这种情况下,使用copy方法,明确告诉是创建的新副本即可。

有关SettingWithCopyWarning的问题,参考文献1中解释得非常详细,强烈建议仔细阅读!

参考文献:
1.https://zhuanlan.zhihu.com/p/41202576

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统命令与网络、磁盘参数和日志监控

文章目录 1、grep搜索命令2、wc命令3、 uptime机器启动时间负载4、ulimit用户资源5、scp远程拷贝6、dos2unix和unix2dos7、sed 1、grep搜索命令 grep命令用于在文件中搜索&#xff0c;并显示匹配效果 # 1、在指定文件查找&#xff0c;查找int main grep int main server.c# 2…

接口自动化测试丨如何处理 Header cookie

Cookie&#xff08;复数形态&#xff1a;Cookies&#xff09;是某些网站为了辨别用户身份而储存在用户本地终端上的数据。在接口测试过程中&#xff0c;如果网站采取了 Cookie 认证的方式&#xff0c;那么发送的请求需要附带 Cookie&#xff0c;才会得到正常的响应的结果。接口…

C#中List<T>的排序相关的使用方法总结

C#中List<>的排序相关的使用方法 list的排序一般使用Sort和LINQ的Orderby方法&#xff0c;本文主要介绍其如何使用。 &#x1f32e;1.Sort和实现Comparable接口 此方式需要类去实现IComparable接口 public class OrderTest {[Test]public void OraderTest(){List<E…

【Excel】如何给Excel表格(文档)加密/上锁

目录 0.环境 1.操作步骤 若只输入了【打开权限密码】 若只输入了【修改权限密码】 若同时输入两种密码 0.环境 windows excel2021版 适用情景&#xff1a; 希望给别人提供文档时&#xff0c;需要用密码打开这个文档&#xff0c;加密又分为【打开时加密】和【修改时加密…

【sentinel】Sentinel规则的持久化

Sentinel规则的推送有下面三种模式: 推送模式说明优点缺点原始模式API将规则推送至客户端并直接更新到内存中简单&#xff0c;无任何依赖不保证一致性&#xff1b;规则保存在内存中&#xff0c;重启即消失。严重不建议用于生产环境Pull模式扩展写数据源&#xff08;WritableDa…

【Flutter】MAC环境下打包APK

1、打开终端生成签名文件 keytool -genkey -v -keystore ~/sign.jks -keyalg RSA -keysize 2048 -validity 10000 -alias sign 结果 输入**库口令: 再次输入新口令: 您的名字与姓氏是什么?[Unknown]: yuanzhiying 您的组织单位名称是什么?[Unknown]: gongsi 您的组织…

第1章 信息化发展

文章目录 1.1信息与信息化1.1.1信息1.信息的定义2.信息的特征与质量 1.1.2信息系统1.信息系统及其特性2.信息系统生命周期 1.1.3信息化1.信息化内涵&#xff08;4个&#xff1a;体系、产业、环境、积累&#xff09;2.信息化体系&#xff08;国家信息化体系 6 要素&#xff1a;上…

Spark SQL数据源:Hive表

文章目录 一、Spark SQL支持读写Hive二、Spark配置hive-site.xml三、准备工作&#xff08;一&#xff09;启动Hive的metastore&#xff08;二&#xff09;启动Spark Shell 四、Spark读写Hive数据&#xff08;一&#xff09;导入SparkSession&#xff08;二&#xff09;创建Spar…

阿里技术官肝了 3 个月才完成的 20 万字 Java 面试手册

金三银四已经过去&#xff0c;不知道你是已经上岸&#xff0c;还是在等秋招。为了让大家能在面试中如鱼得水&#xff0c;offe 能够手到擒来。小编在此分享一份阿里技术官肝了 3 个月才完成的 20 万字 Java 面试手册。 这份面试手册涉及的技术栈非常全面而且足够细致&#xff0…

在字节跳动和阿里划水4年,过于真实了...

先简单交代一下吧&#xff0c;涛哥是某不知名211的本硕&#xff0c;18年毕业加入阿里&#xff0c;之后跳槽到了头条&#xff0c;一直从事测试开发相关的工作。之前没有实习经历&#xff0c;算是四年半的工作经验吧。 这四年半之间他完成了一次晋升&#xff0c;换了一家公司&am…

MySQL数据库用户管理

MySQL数据库用户管理 一、MySQL常用的6大约束二、数据表的高级操作1.克隆表2.清空表&#xff0c;删除表内的所有数据3&#xff0e;创建临时表4&#xff0e;创建外键约束&#xff0c;保证数据的完整性和一致性 三、数据用户管理1.新建用户2&#xff0e;查看用户信息3&#xff0e…

MongoDB 索引操作引起的 Crash

摘要&#xff1a;本文详细阐述了根据引起 Crash 操作进行从配置到源码的分析过程&#xff0c;层层递进&#xff0c;定位复现并给出解决故障方案。 作者&#xff1a;徐耀荣 爱可生南区交付服务部 DBA 团队成员&#xff0c;主要负责 MySQL 故障处理以及相关技术支持。爱好电影&am…

c++学习之多态

目录 1&#xff0c;什么是多态&#xff1f; 2&#xff0c;什么是虚函数&#xff1f; 1.如何实现父类对各个派生子类的操作&#xff1f; 2&#xff0c;父类指针保存子类空间产生的问题。 3&#xff0c;虚函数的定义 4&#xff0c;虚函数的动态绑定机制 5&#xff0c;重载&…

创新方案|时尚品牌企业应用生成式AI的6大机会领域

探讨生成式人工智能&#xff08;Generative AI&#xff09;在时尚产业中的应用&#xff0c;以及它对设计、生产和销售过程的影响。通过使用生成式AI技术&#xff0c;时尚品牌可以更快地设计和生产出更加个性化和符合潮流趋势的产品&#xff0c;同时减少浪费和成本。文章还介绍了…

掌握Python文件操作:从基础到高阶的全方位探索

在本篇博客中&#xff0c;我们将全面、深入地探讨Python中的文件操作。文件操作在Python编程中是不可或缺的一部分&#xff0c;它包含了打开、读取、写入和关闭文件等各种操作。我们将从基础的文件操作讲解到高级的文件处理技巧&#xff0c;以及如何优雅地使用Python进行文件操…

前端vue入门(纯代码)07

【07.TodoList案例】 1 拆分组件 一共拆分为4个组件&#xff1a;【因为header和HTML内置的标签<header>重名&#xff0c;故在之前都加了Todo】 TodoHeaderTodoItem【item是list的子组件】TodoListTodoFooter 2 组件化编码流程 实现静态组件&#xff1a;抽取组件&…

金融行业项目信息化建设方案:人效提升300%

一、行业背景 在大数据、云计算、人工智能等技术的推动下数字化转型正快速改变着金融行业&#xff0c;特别在当下金融与科技深度交互融合的新阶段&#xff0c;“金融科技”正成为金融市场新的趋势。但是在众多传统的金融业务领域&#xff0c;特别是在“投融贷”相关的业务中&a…

深度学习5 -- 循环神经网络(代码实现篇+付详细流程文件)

引言 本文是使用pytorch对循环神经网络RNN(Recurrent Neural Network)的代码实现&#xff0c;作为之前介绍RNN原理的一个代码补充。 RNN原理介绍 本文代码相关介绍相对较为详细&#xff0c;也为自己的一个学习过程&#xff0c;对RNN的理解还是比较浅显&#xff0c;有错误的地…

迪赛智慧数——饼图(环形饼图):哪个年龄段的人最爱存钱?

效果图 50岁到60岁是存钱黄金10年,你存下钱了吗? 据央行发布的2022年金融统计数据报告显示&#xff0c;全年人民币存款额增加26.26万亿元&#xff0c;其中住户存款增加17.84万亿&#xff0c;刷新历史记录。 2022年在全国2200名40岁以下的人中&#xff0c;90后这一职场主力军…

电压放大器在无损检测中的作用和应用有哪些

电压放大器在无损检测中扮演着重要的角色&#xff0c;可以帮助实现信号的放大和增强&#xff0c;从而提高检测的灵敏度和准确性。下面&#xff0c;我们将详细探讨电压放大器在无损检测中的作用和应用。 图&#xff1a;ATA-2000系列高压放大器 电压放大器是一种用于放大电压信号…