这个问题在这里已经有了答案:
How to deal with SettingWithCopyWarning in Pandas
(16 个回答)
11 个月前关闭。
试图弄清楚为什么下面的函数会返回可怕的 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)
根据这个错误: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 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 是副本而不是 View 。
从以下链接了解有关此警告的更多信息
https://www.youtube.com/watch?v=4R4WsDJ-KVc
关于python - SettingWithCopyWarning 使用 Pandas apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615922/