【问题标题】:SettingWithCopyWarning with .loc [duplicate]SettingWithCopyWarning 与 .loc [重复]
【发布时间】:2018-03-16 20:40:55
【问题描述】:

此代码生成 SettingWithCopyWarning,如下所示:

raw_corpus.loc[:,'constructed_recipe']=raw_corpus.loc[:,'trigger_channel_cat'] + " " + raw_corpus.loc[:,'trigger_channel_clean'] + " " + raw_corpus.loc[:,'trigger_name_clean'] + " " + raw_corpus.loc[:,'action_name_clean'] +" " + raw_corpus.loc[:,'action_channel_clean'] +" " + raw_corpus.loc[:,'action_channel_cat']

/Users/dlhoffman/anaconda3/envs/gensim-py35/lib/python3.5/site-packages/pandas/core/indexing.py:537: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s

此代码产生不同的警告:

raw_corpus['constructed_recipe']=raw_corpus['trigger_channel_cat'] + " " + raw_corpus['trigger_channel_clean'] + " " + raw_corpus['trigger_name_clean'] + " " + raw_corpus['action_name_clean'] +" " + raw_corpus['action_channel_clean'] +" " + raw_corpus['action_channel_cat']

/Users/dlhoffman/anaconda3/envs/gensim-py35/lib/python3.5/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
"""

这两段代码都按照我的意愿行事,但错误很烦人,我的理解是这不是一个好的错误。我在这里阅读了文档和人们的建议,但无法弄清楚我做错了什么。

【问题讨论】:

标签: python pandas dataframe copy warnings


【解决方案1】:

这是一个有据可查的错误。看看How to deal with SettingWithCopyWarning in Pandas?

对于修复,从

开始
raw_corpus = raw_corpus.copy(deep=True)

接下来,获取要聚合的所有列的列表:

cols = ['trigger_channel_cat', 'trigger_channel_clean', ...]

并致电df.agg

raw_corpus['constructed_recipe'] = raw_corpus[cols].agg(' '.join, axis=1)

【讨论】:

  • 好人 :-) 没想到在这里可以使用agg
  • 优秀并且学到了一些新东西(.copy, .agg)
  • @Wen 是的,如果不是这样,我会被当作骗子关门的。但我相信这个问题值得回答。 ;)
  • 浅拷贝与深拷贝!但是 df.copy.deepcopy 和 df.copy(deep=True) 有什么区别?
  • @profhoff df.copy 我认为它们的区别在于可变对象列的处理方式,例如列表/字典列(无论如何,复制在这种情况下都会返回引用)。
猜你喜欢
  • 2020-03-28
  • 2014-07-04
  • 2014-10-18
  • 2016-04-09
  • 2016-07-03
  • 2020-01-19
相关资源
最近更新 更多