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

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

但我不确定如何将这些链接在一起。

有没有人对如何简单而干净地实现这一点有任何想法?这对我来说似乎并不难,但这里的其他帖子并没有产生令人满意或有效的答案。


至尊宝的传说
浏览 153回答 1
1回答

忽然笑

使用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)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; groups_mean.add(groups_std.mul(3)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 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)) ))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python