我有一个 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)) ))
添加回答
举报
0/150
提交
取消