当我运行以下代码段时,我得到了臭名昭著的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()对我没有好处。
诚挚并在此致以衷心的感谢
托马斯·菲利普斯
这确实有效——尽管我必须说这根本不是直觉,即使在盯着它看了一段时间之后。这似乎确实与熊猫的实施方式有关。有了你的建议和谷歌,我找到了关于StackOverflow的全面答案
谢谢你的帮忙。
问题是您同时使用了\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方法的文档中,我们具有: 我的结构如下: 我想要这样的东西: 但是当我运行该方法时,它是在说: 这没有意义,即使在示例中,该列上也有重复的条目。我将列用作数据透视表的索引,即方法调用的第一个参数。 问题答案: 对我来说还好吗?您可以发布正在使用的确切数据透视方法调用吗?
如果我有这个数据帧: 并且只希望删除空行以生成以下内容: 做这件事最好的方法是什么?