使用pandas的SettingWithCopyWarning适用于

时间:2017-08-10 14:00:58

标签: 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)

根据此错误,违规行为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: ...)之类的东西看到了这个模式,所以我无法想象所有做错了。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

问题是由于重新调整而不是您使用string resource = "https://******.crm2.dynamics.com/"; string clientId = "**************"; string clientSecret = "************"; string authority = "https://login.microsoftonline.com/*****/oauth2/authorize"; ClientCredential credential = new ClientCredential(clientId, clientSecret); AuthenticationContext authContext = new AuthenticationContext(authority, true); AuthenticationResult result = await authContext.AcquireTokenAsync(resource, credential); 的事实。

apply是一个警告,在分配中检测到链式索引。这并不一定意味着出现了任何问题。

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

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

答案 1 :(得分:4)

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

这样的代码

df = df_test.copy()

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

从以下链接了解有关此警告的详情

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