SettingWithCopyWarning 使用熊猫应用 [重复]

Posted

技术标签:

【中文标题】SettingWithCopyWarning 使用熊猫应用 [重复]【英文标题】:SettingWithCopyWarning using pandas apply [duplicate] 【发布时间】: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,我给你一个答案更深入的了解。 【参考方案1】:

问题是由于重新分配,而不是您使用apply

SettingWithCopyWarning 是在分配中检测到链式索引的警告。这并不一定意味着出了什么问题。

为避免警告,建议像这样使用 .loc

df.loc[:, col] = df[col].apply(...)

【讨论】:

我的知识到此结束,也许可以阅读有关 pandas 中复制的文档。如果您想禁用警告,您可以使用pd.options.mode.chained_assignment = None @coolboyjules 有时您甚至可以在使用 loc 的行上收到警告(如此处),因为您正在使用的 DataFrame (df) 已经模糊地是之前的副本或视图它进入您的函数,因此您需要更改的行将在上面的代码中某处(通常在其他操作中添加.copy())。这很烦人,但就是这样。 这个答案并没有解决我的问题,相反,我在这里找到了另一个答案 (***.com/a/60885847/8046546),它通过在数据框之前添加 .reset_index(drop=True) 来解决错误【参考方案2】:

确定 df 是否是另一个数据框的副本。在这种情况下,您应该编写类似的代码

df = df_test.copy()

这确保 df 是副本而不是视图。

通过以下链接了解有关此警告的更多信息

https://www.youtube.com/watch?v=4R4WsDJ-KVc

【讨论】:

谢谢,这其实是对的,我用副本解决了我的警告。就我而言,我有:df = df_original['col1', 'col2'] 这里添加.copy()。那么这将不再产生警告:df['col1'] = df['col1'].apply(lambda x: x)

以上是关于SettingWithCopyWarning 使用熊猫应用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SettingWithCopyWarning 使用熊猫应用 [重复]

pandas DataFrame 警告(SettingWithCopyWarning)

熊猫:SettingWithCopyWarning 触发位置

实施列比较时的 SettingWithCopyWarning [重复]

为啥 iloc() 的一种使用会给出 SettingWithCopyWarning,而另一种则不会?

pandas警告:SettingWithCopyWarning