我试图在子集的多列中做一个简单的值替换使用.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)
- 部分代码试图获取
- 另一部分正在尝试设置
为了避免这种情况,您可以使用LOC语法。
有一个youtube视频我如何避免SettingWithCopyWarning在熊猫?
也许你能更好地理解引擎盖下发生了什么。
同时,我认为@挪威鲑鱼有正确的答案
注意:我检查了这篇文章是否有人可以建议一个youtube视频的问题。看看@Michael Perrotta的这篇文章。在这种情况下,我认为……如果有人不同意,请让我知道。我只是想帮助和尊重所有的社区。