您好,我有一个数据框,我想用所有列的 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
我有很多列,循环很耗时。有没有更好的方法或者可以一次循环完成吗?
您可以以矢量方式执行此操作:
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