当前位置: 首页 > 知识库问答 >
问题:

熊猫开始复制警告:我完全糊涂了

唐昊焜
2023-03-14

当我运行以下代码段时,我得到了臭名昭著的pandas设置WithCopyWarning:

for i in range(1, N):
    if df['deltaPressure'][i] < CLUSTER_THRESHOLD:
        df['Cluster'][i] = df['Cluster'][i-1]
    else:
        df['Cluster'][i] = df['Cluster'][i-1] + 1

我曾尝试通过添加一个。复制()如下:

for i in range(1, N):
    if df['deltaPressure'][i] < CLUSTER_THRESHOLD:
        df['Cluster'][i] = df['Cluster'][i-1].copy()
    else:
        df['Cluster'][i] = df['Cluster'][i-1].copy() + 1

不幸的是,我没有得到任何改变的警告。大量的谷歌搜索和StackOverflow并没有让我更进一步地理解语法中的根本错误,或者我是如何无意中链接的。代码似乎运行正常,但我讨厌忽略错误消息,希望它们被证明是无关的。

我非常感谢您对我的代码进行修复,并简单解释为什么会出现这种情况。copy()对我没有好处。

诚挚并在此致以衷心的感谢

托马斯·菲利普斯

共有2个答案

何兴邦
2023-03-14

这确实有效——尽管我必须说这根本不是直觉,即使在盯着它看了一段时间之后。这似乎确实与熊猫的实施方式有关。有了你的建议和谷歌,我找到了关于StackOverflow的全面答案

谢谢你的帮忙。

许亦
2023-03-14

问题是您同时使用了\uuuuuu setitem\uuuuuuuuuuuuu\uuuuuuuuuu getitem\uuuuuuuuuu

  • df['Cluster']获取项目

正如https://tomaugspurger.github.io/modern-1-intro中解释的,“熊猫不能保证第一个getitems返回的是视图还是基础数据的副本。这些变化将对我上面所说的_,1中getitem1的结果进行更改。但是我们不知道_与我们最初的"df共享相同的内存。

您应该改用loc/iloc

编辑:重新阅读您的问题,我添加了另一种可能性,以实现您在没有for循环的情况下所做的事情:


import pandas as pd
import numpy as np
N = 100
CLUSTER_THRESHOLD = 50
df = pd.DataFrame({"deltaPressure": np.random.randint(1,100, N),
                   "Cluster": np.random.randint(1,5,N)})
df["top"] = df["deltaPressure"]<CLUSTER_THRESHOLD
df["Cluster"] = np.where(df["top"], df["Cluster"].shift(), df["Cluster"].shift() + 1)

希望有帮助。

 类似资料:
  • 我想用替换大于任意数字(本例中为100)的

  • 问题内容: 当我运行程序时,Pandas每次都会发出如下“未来警告”。 我得到了味精,但我只是想一次又一次地停止Pandas显示此类味精,是否可以设置任何buildin参数以使Pandas不会弹出“未来警告”? 问题答案: 在github上发现了这个…

  • 当我在spyder中使用pandas绘图数据时。它将始终显示一条警告消息: C:\ProgramData\Anaconda3\lib\site packages\pandas\core\index。py:494:SettingWithCopyWarning:试图在数据帧切片的副本上设置值。尝试使用。loc[row\u indexer,col\u indexer]=改为value。请参阅文档中的注意

  • 当我将函数应用于Groupby对象的多个列时,Pandas会抛出一个Future Warning。它建议使用列表作为索引,而不是元组。一个人会怎么做?

  • 问题内容: 在Pandas方法的文档中,我们具有: 我的结构如下: 我想要这样的东西: 但是当我运行该方法时,它是在说: 这没有意义,即使在示例中,该列上也有重复的条目。我将列用作数据透视表的索引,即方法调用的第一个参数。 问题答案: 对我来说还好吗?您可以发布正在使用的确切数据透视方法调用吗?

  • 如果我有这个数据帧: 并且只希望删除空行以生成以下内容: 做这件事最好的方法是什么?