[英]Pandas - Replace outliers with groupby mean
我有一个大熊猫数据框,我想分成几组,计算平均值和标准差,然后用组的平均值替换所有异常值。 如果异常值远离组平均值超过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))
但我得到一个不同的错误:
KeyError: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()。
任何建议都非常感谢。
尝试这个:
def replace(group):
mean, std = group.mean(), group.std()
outliers = (group - mean).abs() > 3*std
group[outliers] = mean # or "group[~outliers].mean()"
return group
df.groupby('a').transform(replace)
注意:如果要消除最后一组中的100,则可以仅用1*std
替换3*std
1*std
。 该组的标准偏差为48.33,因此它将包含在结果中。
首先删除异常值然后计算组替换方法更合适。 如果用异常值计算替换平均值,则平均值受异常值影响
希望这会有所帮助:
第1步,删除异常值( 通过删除异常值从pandas组引用):
def is_outlier(s):
lower_limit = s.mean() - (s.std() * 3)
upper_limit = s.mean() + (s.std() * 3)
return ~s.between(lower_limit, upper_limit)
df = df[~df.groupby('a')['count'].apply(is_outlier)]
第2步,替换异常值(参考elyase):
def replace(group):
mean, std = group.mean(), group.std()
outliers = (group - mean).abs() > 3*std
group[outliers] = mean # or "group[~outliers].mean()"
return group
df.groupby('a').transform(replace)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.