【发布时间】:2014-12-24 14:58:15
【问题描述】:
我有一个 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: 名称“x”未定义
我也试过单独定义一个变换函数:
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()。
非常感谢任何建议。
【问题讨论】: