为什么 iloc() 的一种使用会给出SettingWithCopyWarning,而另一种则不会?

2024-05-27

在类的方法中,我使用以下语句:

self.__datacontainer.iloc[-1]['c'] = value

这样做我得到一个 “设置复制警告: 试图在 DataFrame 中的切片副本上设置一个值”

现在我尝试重现此错误并编写以下简单代码:

import pandas, numpy
df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))
df.iloc[-1]['C'] = 3

我没有得到任何错误。为什么我在第一个语句中出现错误,而在第二个语句中却没有?


链式索引

As the 文档 https://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy以及该网站上的其他几个答案([1] https://stackoverflow.com/questions/21463589/pandas-chained-assignments, [2] https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-pandas)建议,链式索引被认为是不好的做法,应该避免。

因为似乎没有一种优雅的方式来使用基于整数位置的索引 (i.e. .iloc)而不违反链索引规则(从pandas开始v0.23.4),建议改为使用基于标签的索引 (i.e. .loc) 尽可能用于分配目的。

但是,如果您绝对需要按行号访问数据,您可以

df.iloc[-1, df.columns.get_loc('c')] = 42

or

df.iloc[[-1, 1], df.columns.get_indexer(['a', 'c'])] = 42

熊猫行为怪异

根据我的理解,在尝试人为地重现错误时,您期望收到警告是绝对正确的。

到目前为止我发现这取决于数据框的构造方式

df = pd.DataFrame({'a': [4, 5, 6], 'c': [3, 2, 1]})
df.iloc[-1]['c'] = 42 # no warning
df = pd.DataFrame({'a': ['x', 'y', 'z'], 'c': ['t', 'u', 'v']})
df.iloc[-1]['c'] = 'f' # no warning
df = pd.DataFrame({'a': ['x', 'y', 'z'], 'c': [3, 2, 1]})
df.iloc[-1]['c'] = 42 # SettingWithCopyWarning: ...

看来熊猫(至少v0.23.4)在链分配方面以不同的方式处理混合类型和单一类型数据帧[3] https://github.com/pandas-dev/pandas/blob/d9c814fd38f6ff73c53f286fdc71ca9512b81aef/pandas/core/generic.py#L3159

def _check_is_chained_assignment_possible(self):
    """
    Check if we are a view, have a cacher, and are of mixed type.
    If so, then force a setitem_copy check.
    Should be called just near setting a value
    Will return a boolean if it we are a view and are cached, but a
    single-dtype meaning that the cacher should be updated following
    setting.
    """
    if self._is_view and self._is_cached:
        ref = self._get_cacher()
        if ref is not None and ref._is_mixed_type:
            self._check_setitem_copy(stacklevel=4, t='referant',
                                     force=True)
        return True
    elif self._is_copy:
        self._check_setitem_copy(stacklevel=4, t='referant')
    return False

这对我来说确实很奇怪,尽管我不确定这是否不是预期的。

然而,有一个老bug https://github.com/pandas-dev/pandas/issues/9767有类似的行为。


UPDATE

根据开发商 https://github.com/pandas-dev/pandas/issues/24315上述行为是预期的。

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

为什么 iloc() 的一种使用会给出SettingWithCopyWarning,而另一种则不会? 的相关文章

  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 绘制随时间变化的分类数据计数

    我有一个数据框 df 其中有一列包含分类数据 ETH 带有 DateTimeIndex 我想绘制类别counts随着时间的推移 它们按天索引 我最好按年绘制它们 df pd DataFrame County 0 Bexar 3 Nueces
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • Shiny:动态数据框构建; renderUI、观察、reactiveValues

    我认为如何使用 Shiny 的 renderUI 功能动态子集数据的问题经常出现 但我很难理解何时使用 renderUI 带有 uiOutput 而不是其他功能 包括观察 反应 反应值甚至条件面板 我想构建一个完全交互式的数据框架 其中每个
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • Vue-动态导入vue组件

    我有很多组件 我想按需导入 我有一个下拉菜单 其中实际上包含组件列表 即要加载的内容 我试过这个例子
  • 应用程序正在等待调试器附加

    我正在 Eclipse 中开发一个 Android 应用程序 当我尝试在三星选项卡上进行调试时 我在屏幕上收到以下消息 等待调试器 并在其下方写着 应用程序 xxx 正在等待调试器附加 我做了一些搜索 发现 查看目标sdk 重新启动 ecl
  • 如何删除可变参数模板的最后一个参数

    我有以下结构 我想从中删除最后一个参数index sequence template lt std size t values gt struct index sequence I need something like template
  • iCarousel 滚动不顺畅

    我正在使用 iCarousel 滚动标签 在模拟器上一切正常 但在 iPad iPhone 上滚动不顺畅和快速 这是代码 城市列表视图 h import
  • 如何用OpenCV解决图像处理相机IO延迟

    我有一个 OpenCV 程序 其工作原理如下 VideoCapture cap 0 Mat frame while true cap gt gt frame myprocess frame 问题是如果myprocess耗时较长 超过相机的I
  • RecyclerView 仅在某些项目之间添加分隔线

    我想在我的中添加分隔线RecyclerView Layout 我已经搜索了一段时间 但我只能找到利用的解决方案RecyclerView addItemDecoration 这会在所有项目之间添加分隔线 我可以创建一个只有一行的布局并将其添加
  • Hibernate JTA:读取每个环境的数据库连接参数

    我正在使用 hibernate 编写一个 javaEE 应用程序 该应用程序将在多个环境 dev qa prod 等 上运行 并且将具有与每个环境关联的单独的数据库 我想为每个环境分别设置 hibernate 属性 如 jdbc url 用
  • Presto 数组包含一个喜欢某种模式的元素

    例如 我的表中的一列是一个数组 我想检查该列是否包含包含子字符串 denied 的元素 因此 在中午 12 00 拒绝 被管理员拒绝 等元素都将计数 我相信我将不得不使用 like 来识别模式 这个sql该怎么写呢 使用急板数组函数 htt
  • 使用 Git 处理 subversion:忽略对跟踪文件的修改

    我目前正在使用 subversion 存储库 但我正在使用 git 在我的计算机上本地工作 它使工作变得更加容易 但也使 subversion 存储库中发生的一些不良行为变得非常明显 这给我带来了问题 拉取代码后 有一个有点复杂的本地构建过
  • DOM更改后刷新浏览器悬停效果

    我有一个 css 已更改的元素 hover 我还有一些 javascript 可以改变元素的高度 但是如果 javascript 在 hoverstate 处于活动状态 即使高度变化将元素从鼠标下方移出 状态仍保持不变 另外 由于 java
  • 任意类的 const 和非 const 成员函数的模板包装器

    我想要一个模板化类 包装器 它可以采用所有可能的类 T 并使用这些类 函数 的成员函数做一些事情 这里评估 我发现了类似的请求 你可以看看here https stackoverflow com questions 11090109 non
  • 绘制给定 bin 端点和值的直方图

    假设我有一个 bin 边缘数组和一个 bin 值数组 基本上输出plt hist 例如 bins np array 1 2 3 4 5 vals np array 2 5 5 2 如何将其绘制为直方图 编辑 为了清楚起见 我的意思是 val
  • iPhone 6模拟器,隐藏键盘问题

    iPhone 6 是否有一些新的方式 屏幕外 硬按钮 来重新打开隐藏的软键盘 我没有可以测试的物理设备 但我在 iPhone 6 模拟器中看到了一些在 iPad 或 iPhone 5 中看不到的新东西 iPhone 6 在横向视图中现在有一
  • 访问 webapp 外部的文件(Tomcat V6 和 Spring)

    我提供上传图像的选项 并且图像正在上传到 opt uploads contactImages 在 Windows 中为 C opt uploads contactImages 我想在我的 JSP 中显示图像 为此 我尝试通过在主机标签下添加
  • 打印出匿名子程序的代码

    我目前正在一个非常复杂的 Perl 架构中工作 我想创建一些调试工具 由于许多行为涉及匿名子例程 因此我想分析其中一些行为 而我所要做的就是对子例程的引用 简而言之 有没有办法打印子例程引用的代码 因为 Perl 被解释 它可能仍然可用 核
  • 右值和左值上的成员函数重载造成混淆

    我有以下设置 struct foo void bar std cout lt lt lvalue n void bar std cout lt lt rvalue n foo bar int main int arg char argv f
  • Spring MVC 中 init binder 的用途是什么

    这是互联网上 init binder 的代码 InitBinder public void initBinder WebDataBinder binder SimpleDateFormat dateFormat new SimpleDate
  • 使用 REST 协议和 JSON 数据格式测试 Web 服务的最佳工具是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是使用 JSON 数据格式测试 REST Web 服务的新手 我尝试了SOUPUI 但不幸的是不支持
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 为什么 iloc() 的一种使用会给出SettingWithCopyWarning,而另一种则不会?

    在类的方法中 我使用以下语句 self datacontainer iloc 1 c value 这样做我得到一个 设置复制警告 试图在 DataFrame 中的切片副本上设置一个值 现在我尝试重现此错误并编写以下简单代码 import p