试图弄清楚为什么以下函数返回可怕的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: ...)
之类的东西看到了这个模式,所以我无法想象所有做错了。
我做错了吗?做这个的最好方式是什么?我想修改原始数据帧。
感谢您的帮助。
答案 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是副本而不是视图。
从以下链接了解有关此警告的详情