即使在pandas中使用.loc后,也会收到SettingWithCopyWarning警告

时间:2016-10-14 01:19:23

标签: python pandas

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

1 个答案:

答案 0 :(得分:11)

如果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,那么我认为最好不要一个一个地沉默UserWarning,而是在开发代码时保留它们。请注意UserWarning的含义,以及如果修改 - child-does-not-affected-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存在的原因是为了帮助提醒新用户注意这一事实 <{3}},例如

df.iloc[1:].loc[:, 'swallow'] = 'forest'
第一个索引器的结果(例如df

不会影响df.iloc[1:] 返回一份副本。