【问题标题】:'value trying to be set on copy' warning“试图在副本上设置值”警告
【发布时间】:2022-07-15 12:12:39
【问题描述】:

我正在尝试使用 .loc 函数对数据框 子集 的多个列中的值进行简单替换,过程如下:

原始数据框

    cols = [f'Q{i:03}' for i in range(1, 50)]
    vals = np.random.choice(['a', 'b'], (10, len(cols)))
    df = pd.DataFrame(vals, columns=cols)

从原始数据框中,我使用以下方法获取列的子集:

df2=df.iloc[:,np.r_[0:15,21,22,24:40]]

最后我使用

替换列子集中的值
    df2.loc[:,'Q014':'Q032'] = 
    df2.loc[:,'Q014':'Q032'].replace({'a':1,'b':0})

我不明白为什么会收到此警告

试图在 DataFrame 的切片副本上设置一个值。尝试 使用 .loc[row_indexer,col_indexer] = value 代替

我已阅读文档,但看不到问题所在。有人请帮我理解。干杯

【问题讨论】:

    标签: python pandas pandas-loc


    【解决方案1】:

    下面的文章解释清楚。请参考https://www.analyticsvidhya.com/blog/2021/11/3-ways-to-deal-with-settingwithcopywarning-in-pandas/

    如果您的代码按预期工作,您可以通过pd.options.mode.chained_assignment = None 关闭警告。

    编辑:我无法离开 cmets,因此在答案部分发帖。

    【讨论】:

      【解决方案2】:

      无法用这一行回答您的问题,因为您的代码无法触发SettingWithCopyWarning。它可能发生在您的代码的早期。

      cols = [f'Q{i:03}' for i in range(1, 50)]
      vals = np.random.choice(['a', 'b'], (10, len(cols)))
      df = pd.DataFrame(vals, columns=cols)
      
      df.loc[:,'Q014':'Q032'] = df.loc[:,'Q014':'Q032'].replace({'a':1,'b':0})
      

      输出:

      >>> df.loc[:, 'Q014':'Q032']
        Q014 Q015 Q016 Q017 Q018 Q019 Q020 Q021 Q022 Q023 Q024 Q025 Q026 Q027 Q028 Q029 Q030 Q031 Q032
      0    1    0    0    0    1    0    1    1    1    0    0    0    1    0    1    0    0    1    0
      1    1    0    1    0    1    0    0    0    0    0    0    0    0    1    0    0    0    1    1
      2    1    1    1    0    1    1    0    0    0    1    0    0    0    0    0    0    0    1    0
      3    1    0    1    0    0    1    0    0    1    0    1    0    1    0    1    1    1    1    0
      4    0    1    0    0    0    0    0    0    1    0    1    1    0    1    1    0    0    0    0
      5    0    1    0    1    1    1    0    0    0    1    1    1    0    1    1    1    1    1    1
      6    0    0    0    0    0    0    0    1    1    1    0    0    0    1    0    1    1    0    1
      7    1    1    0    0    0    1    1    1    0    0    0    1    1    1    1    1    0    1    1
      8    1    0    0    0    1    0    1    1    1    0    0    1    1    0    1    1    1    1    0
      9    0    1    1    0    0    0    0    1    1    0    1    1    1    1    1    1    1    0    0
      

      【讨论】:

      • 谢谢@Corralien。我根据您的 cmets 编辑了我的问题。
      【解决方案3】:

      基本上。当您使用 DOT NOTATION 时(如 df.your_column)

      1. 部分代码试图获取一些东西
      2. 另一部分正在尝试设置一些东西

      为避免这种情况,您可以使用带有 LOC 的语法。

      有一个youtube视频How do I avoid a SettingWithCopyWarning in pandas?

      也许您可以更好地了解幕后发生的事情。

      另外,我认为@Norwegian Salmon 的答案是正确的

      注意:我检查了这篇文章是否是一个有人可以推荐 youtube 视频的问题。 Check this post 来自@Michael Perrotta。在这种情况下,我想是的......如果有人不同意,请告诉我。我只是想帮助和尊重所有社区。​​p>

      【讨论】:

        猜你喜欢
        • 2019-03-30
        • 2016-06-16
        • 2016-12-22
        • 2021-03-05
        • 2017-08-25
        • 1970-01-01
        • 2016-09-23
        • 2016-02-17
        • 2016-08-24
        相关资源
        最近更新 更多