Pandas A value is trying to be set on a copy of a slice from a DataFrame(转)

由于刚好也遇到这个问题,记录下来

使用的DataFrame的

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

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

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

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

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

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

第一种访问方式

使用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会造成警告.

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

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

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

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

解决警告的方案:

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

Original: https://www.cnblogs.com/luhouxiang/p/12306822.html
Author: 绿色的麦田
Title: Pandas A value is trying to be set on a copy of a slice from a DataFrame(转)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/9170/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总