【问题标题】:Can't get around Pandas Series SettingWithCopyWarning无法绕过 Pandas 系列 SettingWithCopyWarning
【发布时间】:2018-05-15 18:33:40
【问题描述】:

我想获取Series 并对其进行更改,我想稍后在DataFrame 中反映出来。但是,如果没有SettingWithCopyWarning,我无法理解如何做到这一点。这是误报还是我做错了什么?

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=list('abc'))
df['d'] = df['a'].diff()
d = df.loc[:, 'd']
d.loc[d>0] *= 3

我已阅读文档(是的,我在询问之前确实阅读了 this question,但它只处理 DataFrames 而不是系列),但无法弄清楚如何解决这个问题。我不想禁用警告,因为我有代码不想在不经意间犯这种类型的错误。

【问题讨论】:

标签: python pandas chained-assignment


【解决方案1】:

我想获取一个系列并对其进行更改,我希望 稍后反映在 DataFrame 中。

在这种情况下,您应该暂时禁用此警告并照常进行。使用.copy() 将意味着您原来的df 不会因d 的更改而改变。

with pd.option_context('mode.chained_assignment', None):
    df = pd.DataFrame([[1,2,3],[4,5,6]], columns=list('abc'))
    df['d'] = df['a'].diff()
    d = df.loc[:, 'd']
    d.loc[d>0] *= 3

# Code you run outside of `with` will maintain your original setting:
# pd.get_option('chained_assignment')

option_context 是上下文管理器,意味着它可以与with 一起使用,并且该选项仅适用于块内的代码。

阅读更多:熊猫 > Getting & Setting Options

【讨论】:

  • 临时禁用是一个很好的建议,如果没有“真正”的解决方案,我会坚持下去!
  • 随着时间的推移,我不能不同意这个解决方案。我是个业余爱好者
  • @Bharath 根本不是人。这是一个棘手的话题,因为在少数情况下,这是一个实际上应该被忽略的警告。
猜你喜欢
  • 2014-12-30
  • 2017-06-25
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2020-08-17
  • 2017-11-21
  • 2017-07-07
相关资源
最近更新 更多