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
答案 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:]
返回一份副本。