问题标签 [chained-assignment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
30722 浏览

python - 混淆重新:数据框警告切片的熊猫副本

我查看了一堆与此问题相关的问题和答案,但我仍然发现我在我不期望的地方收到了切片警告的副本。此外,它出现在以前对我来说运行良好的代码中,这让我想知道某种更新是否可能是罪魁祸首。

例如,这是一组代码,我所做的只是将 Excel 文件读入 pandas DataFrame,并减少df[[]]语法中包含的列集。

现在,我对该izmir_lim文件所做的任何进一步更改都会引发切片警告的副本。

/Users/samillienfeld/anaconda/lib/python3.5/site-packages/ipykernel/ main .py:2:SettingWithCopyWarning:试图在数据帧的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value

我很困惑,因为我认为df[[]]列子集默认返回一个副本。我发现抑制错误的唯一方法是显式添加df[[]].copy(). 我可以发誓过去我不必这样做,也没有引发切片错误的副本。

同样,我还有一些其他代码在数据帧上运行函数以以某些方式对其进行过滤:

从现在开始,我对任何值所做的任何更改都会df_lim引发切片错误的副本。我发现的唯一解决方法是将函数调用更改为:

这对我来说似乎是错误的。我错过了什么?似乎这些用例应该默认返回副本,我可以发誓我上次运行这些脚本时没有遇到这些错误。
我只需要开始到处添加.copy()吗?似乎应该有一种更清洁的方法来做到这一点。非常感谢任何见解或帮助。

0 投票
1 回答
611 浏览

python - 没有 SettingWithCopyWarning 的不可预测的 pandas 切片分配行为

众所周知(并且可以理解),当分配给切片时,pandas 的行为本质上是不可预测的。但我习惯于被警告SettingWithCopy警告。

为什么以下两个代码片段都没有生成警告,哪些技术可以减少无意中编写此类代码的机会?

我认为解释是熊猫仅在当前上下文仍可访问父 DataFrame 时才会产生警告。(这将是检测算法的一个弱点,正如我之前的示例所示。)

在下一个片段中,AFAIK 原始的两列 DataFrame 不再可访问,但 pandas 警告机制设法触发(幸运的是):

编辑:

在对此进行调查时,我发现了另一种缺少警告的情况:

即使一个几乎相同的示例确实触发了警告:

更新:我在这里回复@firelynx 的答案,因为很难把它放在评论中。

在答案中,@firelynx 说第一个代码片段不会导致任何警告,因为我正在获取整个数据帧。但即使我参与其中,我仍然没有收到警告:

0 投票
1 回答
185 浏览

python - 数据框视图或副本有什么好处

我见过很多关于臭名昭著的SettingWithCopy警告的问题。我什至敢于回答其中的几个。最近,我正在整理一个涉及该主题的答案,我想展示数据框视图的好处。我未能提供具体的演示来说明为什么创建数据框视图或生成的任何东西是一个好主意SettingWithCopy

考虑df

dfv是一个副本df




我可以生成SettingWithCopy

在此处输入图像描述


然而,dfv变了

df没有


仍然dfv是副本


如果我改变df


dfv一直没有改变。但是,我可以df参考dfv


问题

如果dfv维护它自己的数据(意思是,它实际上并没有节省内存)并且它通过赋值操作分配值,尽管有警告,那么为什么我们首先要费心保存引用并生成SettingWithCopyWarning呢?

有什么实实在在的好处?

0 投票
1 回答
1973 浏览

python - df.loc 导致 SettingWithCopyWarning 警告消息

我的代码的以下行导致警告:

根据文档,这是推荐的做法,那么发生了什么?

谢谢你的帮助。

0 投票
2 回答
2002 浏览

python - 创建新列和删除 NaN 行时的 SettingwithCopy

我一直在寻找阅读熊猫文档here并尝试从herehere发布的问题中使用不同的代码行,我似乎无法摆脱带有复制警告的设置。我更愿意学习以“正确”的方式对其进行编码,而不是仅仅忽略警告。

以下代码行位于 for 循环中,我不想多次生成此警告,因为它可能会减慢速度。

我正在尝试使用名称创建一个新列:'E'+vs where vs is a string in a list in for loop

但是对于它们中的每一个,我仍然收到以下警告,即使是最后 3 行:

以下是我迄今为止尝试过的麻烦线:

另一个给出 SettingWithCopyWarning 的是:

这个也发出了警告(但我认为这个会)

如何正确执行这两项操作?

编辑:这是产生原始 df_out 的代码

0 投票
4 回答
6632 浏览

python - 为什么盲目使用 df.copy() 来修复 SettingWithCopyWarning 是个坏主意

有无数关于可怕的问题SettingWithCopyWarning

我很清楚它是如何产生的。(注意我说好,不是很好)

当一个数据df帧通过存储在is_copy.

这是一个例子

我们可以将该属性设置为None

我见过像@Jeff 这样的开发人员,我不记得还有谁,警告这样做。引用SettingWithCopyWarning有一个目的。

问题
好的,那么有什么具体的例子来说明为什么通过分配一个copy回原件来忽略警告是一个坏主意。

我将定义“坏主意”以进行澄清。


主意 将代码放入生产环境 是个坏主意,这会导致在星期六晚上接到一个电话,说您的代码已损坏并且需要修复。

现在如何使用df = df.copy()才能绕过SettingWithCopyWarning导致接到那种电话。我想把它说清楚,因为这是混乱的根源,我正试图弄清楚。我想看看爆炸的边缘案例!

0 投票
3 回答
125 浏览

python - 使用带有大表的循环的 python 性能问题

我正在使用 python 和多个库(如 pandas 和 scipy)来准备数据,以便开始更深入的分析。例如,出于准备目的,我正在创建具有两个日期差异的新列。
我的代码提供了预期的结果,但速度很慢,所以我不能将它用于具有 80K 行的表。运行时间大约需要。80分钟的表只为这个简单的操作。

问题肯定和我的写作操作有关:


此外,python 提供了一个警告:

在此处输入图像描述

日期差异的完整代码示例:

正确的结果表:

---

0 投票
1 回答
244 浏览

python - 如何在不生成 SettingWithCopyWarning 的情况下将列插入 DataFrame

我想在现有的 DataFrame 中插入一列。理想情况下不复制现有数据。无论我尝试什么,如果插入的数据包含空值,以后对结果 DataFrame 的分配都会生成一个 SettingWithCopyWarning。

替换assign

导致相同的警告。

奇怪的是,如果插入的值不为空(例如,用 0 替换 pd.NaT)不会产生警告。那是一个错误吗?

0 投票
1 回答
148 浏览

python - 无法绕过 Pandas 系列 SettingWithCopyWarning

我想获取 aSeries并对其进行更改,我想DataFrame稍后再反映。但是,如果没有SettingWithCopyWarning. 这是误报还是我做错了什么?

我已经阅读了文档(的,我在询问之前确实阅读了这个问题,但它只处理 DataFrames 而不是系列),但无法解决这个问题。我不想禁用警告,因为我有代码不想在不经意间犯这种错误。

0 投票
1 回答
602 浏览

python - Where does this pandas warning come from?

I have a DataFrame. To do a statistical conditional test, I split it into two based on a boolean column ('mar'). I want to use the ratio of counts between the two tables to add a column expressing the proportion of true values in the 'mar' column for each combination of the other columns, as seen below.

I've gone to the suggested page to investigate the warning. When I assign the new column, I am using the form df_mar.loc[:, 'prop'] = ..., just as suggested.

So why am I still getting this warning?