熊猫SettingWithCopyWarning:我很困惑

时间:2020-05-03 05:11:01

标签: python pandas chaining

当我运行以下代码段时,我得到了臭名昭著的熊猫SettingWithCopyWarning:

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

我尝试通过添加.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

很遗憾,我对警告没有任何更改。大量的搜索和搜索StackOverflow使我无法进一步了解语法中的基本错误或我无意中如何进行链接。该代码似乎可以正确运行,但是我不想忽略错误消息,以希望它们与实际无关。

我很感激,既修复了我的代码,又简单解释了为什么.copy()对我不利。

衷心的感谢!

托马斯·飞利浦

2 个答案:

答案 0 :(得分:2)

问题是您同时使用null__setitem__

  • __getitem__df['Cluster']
  • __getitem__ _[i] =

https://tomaugspurger.github.io/modern-1-intro中所述,”熊猫无法保证第一个 getitem 返回的是视图还是基础数据的副本。更改将对我在上面所说的_是 getitem 在1中的结果。但是我们不知道_与我们的原始记忆具有相同的记忆力。 __setitem__

您应该改用df / loc

编辑:重新阅读您的问题,我添加了另一种可能的实现方式,而无需for循环:

iloc

希望有帮助。

答案 1 :(得分:0)

这确实有效-尽管我必须说,即使盯着它看了一会儿也不是很直观。它似乎确实与熊猫的实施方式有关。有了您的建议和Google,我在StackOverflow

上找到了全面的答案

感谢磨坊。