'value trying to be set on copy'警告



我试图在子集的多列中做一个简单的值替换使用.loc函数对数据帧进行处理,使用以下过程:

原始dataframe

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})

我不明白为什么我得到这个警告

试图在数据帧的切片副本上设置值。试一试使用。loc[row_indexer,col_indexer] = value代替

我已经阅读了文档,但我看不出问题是什么。有人能帮我理解吗?欢呼声

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

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

编辑:我无法留下评论,因此在回答部分张贴。

这是不可能回答你的问题与这一行,因为你的代码不能触发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

基本上。当您使用DOT表示法(如df.your_column)

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

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

有一个youtube视频我如何避免SettingWithCopyWarning在熊猫?

也许你能更好地理解引擎盖下发生了什么。

同时,我认为@挪威鲑鱼有正确的答案

注意:我检查了这篇文章是否有人可以建议一个youtube视频的问题。看看@Michael Perrotta的这篇文章。在这种情况下,我认为……如果有人不同意,请让我知道。我只是想帮助和尊重所有的社区。

相关内容

最新更新