python - SettingWithCopyWarning 使用 Pandas apply

标签 python pandas

这个问题在这里已经有了答案:





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/

相关文章:

python - 使用 Python 的 ujson 模块的 JSON 转储非数字 float

python - 比较两个数据框以进行分类

python - 查找连续索引 pandas

python - Pandas 使用其他 Dataframe 更新 Dataframe

Python:哪个占用内存更少且执行速度快?

python - 如何从 [c_api.h] 向 TF_SessionRun 提供训练数据

python - App Engine 模型自引用属性和父子关系

python - Selenium 对我来说真的很慢,我的代码有问题吗?

python - 基于多列操作数据

python-3.x - 用 Pandas 中的if条件逐列求和