试图找出为什么下面的函数返回可怕的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)
Run Code Online (Sandbox Code Playgroud)
违规行是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: ...),所以我无法想象他们所有人都做错了.
我做错了吗?做这个的最好方式是什么?我想修改原始数据帧.
谢谢你的帮助.
确保df是否是另一个数据帧的副本。在这种情况下,您应该像这样编写代码
df = df_test.copy()
这样可以确保df是副本而不是视图。
通过以下链接了解有关此警告的更多信息
https://www.youtube.com/watch?v=4R4WsDJ-KVc
问题是由于重新调整而不是您使用的事实apply.
SettingWithCopyWarning是一个警告,已在分配中检测到链式索引.它并不一定意味着出了什么问题.
为了避免,警告,如同建议使用.loc这样
df.loc [:,col] = df [col] .apply(...)