【问题标题】:Getting SettingWithCopyWarning warning even after using .loc in pandas [duplicate]即使在熊猫中使用 .loc 后也会收到 SettingWithCopyWarning 警告[重复]
【发布时间】:2017-02-23 07:31:50
【问题描述】:
df_masked.loc[:, col] = df_masked.groupby([df_masked.index.month, df_masked.index.day])[col].\
            transform(lambda y: y.fillna(y.median()))

即使在使用 .loc 之后,我也明白了。错误,我该如何解决?

Anaconda\lib\site-packages\pandas\core\indexing.py:476: 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

【问题讨论】:

标签: python pandas


【解决方案1】:

如果df_masked 是某个其他 DataFrame 的子 DataFrame,您可能会收到此 UserWarning。 特别是,如果数据已从原始 DataFrame 复制df_masked,那么 Pandas 会发出 UserWarning 以提醒您修改 df_masked 不会影响原始 DataFrame。

如果您不打算修改原始 DataFrame,那么您可以随意忽略 UserWarning。

There are ways 在每个语句的基础上关闭 UserWarning。特别是,您可以使用df_masked.is_copy = False

如果您经常遇到此 UserWarning,那么与其将 UserWarnings 逐个静音,我认为最好在开发代码时保留它们。请注意 UserWarning 的含义,如果 modifying-the-child-does-not-affect-the-parent 问题不影响您,请忽略它。当您的代码准备好投入生产时,或者如果您有足够的经验不需要警告,请完全关闭它们

pd.options.mode.chained_assignment = None

靠近代码顶部。


这里有一个简单的例子来说明问题和(a)解决方案:

import pandas as pd

df = pd.DataFrame({'swallow':['African','European'], 'cheese':['gouda', 'cheddar']})
df_masked = df.iloc[1:]
df_masked.is_copy = False   # comment-out this line to see the UserWarning
df_masked.loc[:, 'swallow'] = 'forest'

UserWarning 存在的原因是为了帮助提醒新用户注意以下事实: chained-indexing

df.iloc[1:].loc[:, 'swallow'] = 'forest'

不会影响df第一个索引器的结果(例如df.iloc[1:]) 返回一个副本。

【讨论】:

  • 感谢@unutbu,你是对的,df_masked 是一个副本。
  • 这解决了我的问题
  • 更新:属性 df.is_copy 在 pandas 版本 0.25.3 中已弃用。您可以改用df._is_copy
猜你喜欢
  • 2018-09-11
  • 2016-12-13
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2016-07-03
  • 2018-11-24
相关资源
最近更新 更多