我有一个Pandas数据框,我想把它分成几组,计算均值和标准差,然后用组的均值替换所有异常值。如果异常值与组均值相差超过3个标准差,则定义为异常值。
df = pandas.DataFrame({'a': ['A','A','A','B','B','B','B'], 'b': [1.1,1.2,1.1,3.3,3.4,3.3,100.0]})
我认为以下内容会有效果:
我认为以下内容会有效果:
df.groupby('a')['b'].transform(lambda x: x[i] if np.abs(x[i]-x.mean())<=(3*x.std()) else x.mean() for i in range(0,len(x)))
但是遇到了以下错误:
NameError: name 'x' is not defined
我还尝试过单独定义一个转换函数:
def trans_func(x):
mean = x.mean()
std = x.std()
length = len(x)
for i in range(0,length):
if abs(x[i]-mean)<=(3*std):
return x
else:
return mean
然后像这样调用它:
df.groupby('a')['b'].transform(lambda x: trans_func(x))
但是我得到了一个不同的错误:
关键错误:0
最后,我不得不创建一个单独的列:
df['c'] = [df.groupby('a')['b'].transform(mean) if df.groupby('a')['b'].transform(lambda x: (x - x.mean()) / x.std()) > 3 else df['b']]
但这也没有起作用:
ValueError:一个Series的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
非常感谢您的任何建议。