为了账号安全,请及时绑定邮箱和手机立即绑定

在 Pandas 中删除具有标准偏差的组中的异常值?

在 Pandas 中删除具有标准偏差的组中的异常值?

至尊宝的传说 2022-07-05 19:43:28
我有一个 Pandas 数据框,我正在尝试逐组删除异常值。如果组中的每一行超出列的范围,则将其视为异常值[group_mean - (group_std_dev * 3), group_mean + (group_std_dev * 3)]其中 group_mean 是组中列的平均值,group_std_dev 是组中列的标准差。我尝试了以下熊猫链df.groupby(by='group').apply(lambda x: x[(x['col'].mean() - (x['col'].std() * 3)) < x['col'] < (x['col'].mean() - (x['col'].std() * 3)])但它似乎没有工作,因为 Pandas 会在 apply 内部进行比较时引发以下错误The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().该错误对我来说似乎没有多大意义,因为比较应该转换为一系列布尔值,然后将其应用于组 x?但是,仅通过上限或下限进行过滤确实有效,例如df.groupby(by='group').apply(lambda x: x[(x['col'].mean() - (x['col'].std() * 3)) < x['col'])但我不确定如何将这些链接在一起。有没有人对如何简单而干净地实现这一点有任何想法?这对我来说似乎并不难,但这里的其他帖子并没有产生令人满意或有效的答案。
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

使用GroupBy.transformand Series.between,这样更快:


groups = df.groupby('group')['col']

groups_mean = groups.transform('mean')

groups_std = groups.transform('std')

m = df['col'].between(groups_mean.sub(groups_std.mul(3)),

                      groups_mean.add(groups_std.mul(3)),

                      inclusive=False)

print(m)

new_df = df.loc[m]

When should I want to use apply


您的应用代码可能是:


df.groupby(by='group')['col'].apply(lambda x: x.lt( x.mean().add(x.std().mul(3)) ) & x.gt( x.mean().sub(x.std().mul(3)) ))



查看完整回答
反对 回复 2022-07-05
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信