【发布时间】:2018-01-18 20:00:10
【问题描述】:
试图弄清楚为什么下面的函数会返回可怕的SettingWithCopyWarning...
这是我打算通过引用修改数据框df 的函数。
def remove_outliers_by_group(df, cols):
"""
Removes outliers based on median and median deviation computed using cols
:param df: The dataframe reference
:param cols: The columns to compute the median and median dev of
:return:
"""
flattened = df[cols].as_matrix().reshape(-1, )
median = np.nanmedian(flattened)
median_dev = np.nanmedian(np.abs(flattened) - median)
for col in cols:
df[col] = df[col].apply(lambda x: np.nan if get_absolute_median_z_score(x, median, median_dev) >= 2 else x)
根据此错误,违规行是df[col] = df[col].apply(lambda x: np.nan if get_absolute_median_z_score(x, median, median_dev) >= 2 else x):
试图在 DataFrame 的切片副本上设置一个值。尝试 使用 .loc[row_indexer,col_indexer] = value 代替
请参阅文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df[col] = df[col].apply(lambda x: np.nan if get_absolute_median_z_score(x, median, median_dev) >= 2 else x)
我不明白的是,我到处都看到这种模式,使用类似 df['a'] = df['a'].apply(lambda x: ...) 的东西,所以我无法想象 所有 他们都做错了。
我做错了吗?做这个的最好方式是什么?我想修改 original 数据框。
感谢您的帮助。
【问题讨论】:
-
这不是由于应用方法,而是因为您重新分配了数据框的一列。你可以使用
copy()或者干脆禁用警告。 -
那么我是在修改那行中的原始数据框吗?这就是我想要的。或者我是在创建一个新的数据框而不是修改传递的
df(我不想要这个) -
其实你是在修改原来的dataframe,我给你一个答案更深入的了解。