使用pandas的SettingWithCopyWarning适用

coo*_*les 4 python pandas

试图找出为什么下面的函数返回可怕的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: ...),所以我无法想象他们所有人都做错了.

我做错了吗?做这个的最好方式是什么?我想修改原始数据帧.

谢谢你的帮助.

Laz*_*our 7

确保df是否是另一个数据帧的副本。在这种情况下,您应该像这样编写代码

df = df_test.copy()

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

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

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


Tho*_*rsp 5

问题是由于重新调整而不是您使用的事实apply.

SettingWithCopyWarning是一个警告,已在分配中检测到链式索引.它并不一定意味着出了什么问题.

为了避免,警告,如同建议使用.loc这样

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

  • @coolboyjules有时你甚至可以在使用`loc`(如此处)的行上获得警告,因为你已经使用的数据框(`df`)在进入你的函数之前已经是一个副本或视图,所以你需要更改的行将在某个地方的代码中(通常在某些其他操作上添加`.copy()`).这很烦人,但确实如此. (8认同)
  • 我试过了,但我也得到了警告. (6认同)
  • 这个答案没有解决我的问题,相反,我在这里找到了另一个答案(/sf/answers/4262009321/),它通过在数据帧之前添加 .reset_index(drop=True) 来解决错误 (2认同)