避免引发带有复制警告的设置

Avoid raising Setting with copy warning

提问人:Uqhah 提问时间:2/3/2023 更新时间:2/4/2023 访问量:52

问:

假设我有一个包含列 a、b、c、d 的数据帧 df,我想从 a、b、d 列中减去列的平均值。我如何实现同样的目标?

我已经尝试过,但我得到了 SettingWithCopyWarning。如何在没有警告的情况下实现相同的目标?df[['a','b','d']] = df[['a','b','d']] - df[['a','b','d']].mean()

python pandas 警告 pandas-settingwithcopy-warning

评论


答:

0赞 Timeless 2/3/2023 #1

您确定您正在该声明/行收到警告吗?

无论如何,以潘多拉的方式并减少可见的噪音,我会这样做:

cols = ["a", "b", "d"]

df[cols] = df[cols].sub(df[cols].mean())
1赞 jsn 2/3/2023 #2

df[['a','b','d']] 是原始 DataFrame 的类似视图...尝试在视图中设置值可能每次都有效,也可能无效

单独进行

df['a']=df['a'].mean()
df['b']=df['b'].mean()
df['d']=df['d'].mean()

它在性能上没有太大区别

评论

0赞 B Remmelzwaal 2/3/2023
或者为了可维护性。[df[x] = df[x].mean() for x in ['a', 'b', 'd']]
0赞 Hamzah 2/4/2023 #3

当您尝试直接修改数据帧的切片时,例如 df[['a','b','d']],如果您不小心,这可能会导致意外行为。因此,出现此警告是为了仔细警告您,原始数据帧正在通过执行此复制过程进行更改。若要禁止显示此警告,可以使用:

mean = df[['a','b','d']].mean()
df[['a','b','d']] = df[['a','b','d']] - mean

df.loc[:, ['a','b','d']] = df[['a','b','d']] - df[['a','b','d']].mean()