如何基于逐列将所有列的异常值替换为3个标准差值?

问题描述 投票:0回答:1

您好,我有一个数据框,我想用所有列的 3* 标准差值替换/限制异常值,并为每列分组。例如:

df = pd.DataFrame({"A":["A", "B", "A", "A", "B","B"], 
                   "B":[7, 2, 54, 3, 5,23], 
                   "C":[20, 16, 11, 3, 8,5], 
                   "D":[14, 3, 35, 2, 6,5]}) 

feature=['B','C','D']

mean = df.groupby('A')[feature].mean()
std = df.groupby('A')[feature].std()

现在我想用该组的适当标准差替换特征中每列的异常值。

类似于下面的内容,但对于每个组和每列

for col in feature:
 for each in df['A'].unique():
  m=mean.loc[each,col]
  s=std.loc[each,col]
  df.loc[each,df[col]< m-3*s,]=m-3*s

我有很多列,循环很耗时。有没有更好的方法或者可以一次循环完成吗?

python python-3.x pandas lambda vectorization
1个回答
0
投票

您可以以矢量方式执行此操作:

cols = ['B', 'C', 'D']

g = df.groupby('A')[cols].transform
mean = g('mean')
std = g('std')

tmp = mean-3*std
df[df[cols]< tmp] = tmp

输出:

   A   B   C   D
0  A   7  20  14
1  B   2  16   3
2  A  54  11  35
3  A   3   3   2
4  B   5   8   6
5  B  23   5   5
© www.soinside.com 2019 - 2024. All rights reserved.