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 [重复]