【问题标题】:Pandas SettingWithCopyWarning: I'm thoroughly confusedPandas SettingWithCopyWarning:我很困惑
【发布时间】:2020-08-17 13:28:43
【问题描述】:

当我运行以下代码段时,我得到了臭名昭著的熊猫 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() 对我没有好处。

在此致以诚挚的谢意

托马斯·飞利浦

【问题讨论】:

    标签: python pandas chaining


    【解决方案1】:

    问题是您同时使用__setitem____getitem__

    • df['Cluster']__getitem__
    • _[i] =__setitem__

    正如https://tomaugspurger.github.io/modern-1-intro 中解释的那样,“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)
    

    希望对你有帮助。

    【讨论】:

    • 实际上我做到了,没有任何影响 - 我的代码现在显示为: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
    【解决方案2】:

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

    谢谢你。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多