Python 熊猫设置与复制警告:I';我完全糊涂了

Python 熊猫设置与复制警告:I';我完全糊涂了,python,pandas,chaining,Python,Pandas,Chaining,当我运行以下代码段时,我得到了臭名昭著的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 范围(1,N)内的i的: 如果df['del

当我运行以下代码段时,我得到了臭名昭著的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
范围(1,N)内的i的
:
如果df['deltaPressure'][i]
我尝试通过添加.copy()来修复它,如下所示:

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
范围(1,N)内的i的
:
如果df['deltaPressure'][i]
不幸的是,我没有得到任何改变的警告。大量的谷歌搜索和StackOverflow并没有让我更进一步地理解语法中的根本错误,或者我是如何无意中链接的。代码似乎运行正常,但我讨厌忽略错误消息,希望它们被证明是无关的

我非常感谢您对我的代码进行修复,并简单解释一下.copy()对我没有好处的原因

谨此致以诚挚的谢意


Thomas Philips

问题在于,您同时使用了
\uuuuuu setitem\uuuuuuuuuu
\uuuuuuu getitem\uuuuuuuuuu

  • df['Cluster']
    \uuuu getitem\uuuu
  • \ui]=
    \uuuuuuuuuu设置项目
如中所述,“pandas无法保证第一个getitem是否返回基础数据的视图或副本。将对上面我调用的东西进行更改,这是1中getitem的结果。但我们不知道,\与原始的“
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)

作为pd进口熊猫
将numpy作为np导入
N=100
集群_阈值=50
df=pd.DataFrame({“deltaPressure”:np.random.randint(1100,N),
“簇”:np.random.randint(1,5,N)})

df[“top”]=df[“deltaPressure”]问题在于您同时使用
\uuuuu setitem\uuuuuuuu
\uuuu getitem\uuuuuu

  • df['Cluster']
    \uuuu getitem\uuuu
  • \ui]=
    \uuuuuuuuuu设置项目
如中所述,“pandas无法保证第一个getitem是否返回基础数据的视图或副本。将对上面我调用的东西进行更改,这是1中getitem的结果。但我们不知道,\与原始的“
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)

作为pd进口熊猫
将numpy作为np导入
N=100
集群_阈值=50
df=pd.DataFrame({“deltaPressure”:np.random.randint(1100,N),
“簇”:np.random.randint(1,5,N)})

df[“top”]=df[“deltaPressure”]这确实有效——尽管我必须说这根本不是直观的,即使在盯着它看了一会儿。这似乎确实与熊猫的实施方式有关。有了你的建议和谷歌,我在网上找到了一个全面的答案


感谢一个磨坊。

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


谢谢大家。

实际上我做到了,没有任何影响-我的代码现在是:df['Cluster'].iloc[I]=df['Cluster'].iloc[I]=I.iloc[I-1].copy()和df['Cluster'].iloc[I]=df['Cluster'].iloc[I-1].copy()。不幸的是,我仍然得到警告!因此产生了混淆。您是否尝试过在列选择中使用iloc包括
df.iloc[i,df.columns.get_loc(“Cluster”)]=df.iloc[i-1,df.columns.get_loc(“Cluster”)]+1
?事实上是这样做的,没有任何影响-我的代码现在是:df['Cluster'].iloc[i]=df['Cluster'].iloc[i-1].copy()和df['Cluster'.iloc[i]=df['Cluster'.iloc][i-1].copy()+1.不幸的是,我仍然收到警告!因此产生了混乱。您是否尝试将iloc包括用于列选择
df.iloc[i,df.columns.get_loc(“Cluster”)]=df.iloc[i-1,df.columns.get_loc(“Cluster”)]+1