gpt4 book ai didi

python - Pandas - 用 groupby 均值替换异常值

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:24 26 4
gpt4 key购买 nike

我有一个 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))

但我得到了一个不同的错误:

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: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or 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,您可以将 3*std 替换为 1*std。该组的标准偏差为 48.33,因此将包含在结果中。

关于python - Pandas - 用 groupby 均值替换异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27638743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com