提问人:Uqhah 提问时间:2/3/2023 更新时间:2/4/2023 访问量:52
避免引发带有复制警告的设置
Avoid raising Setting with copy warning
问:
假设我有一个包含列 a、b、c、d 的数据帧 df,我想从 a、b、d 列中减去列的平均值。我如何实现同样的目标?
我已经尝试过,但我得到了 SettingWithCopyWarning。如何在没有警告的情况下实现相同的目标?df[['a','b','d']] = df[['a','b','d']] - df[['a','b','d']].mean()
答:
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()
评论