我有以下13个不同品牌(xx,yy,zz等)的数据框,每个品牌有365行(按品牌进行全年观察)。这是df.head()的结果。
brand exMarketplaces incMarketplaces availabilityRate
date
2015-08-01 xx 54372.8601 65826.384700 0.260209
2015-08-02 xx 74335.6785 89722.492300 0.255547
2015-08-03 xx 78563.0134 110132.200751 0.262365
2015-08-04 xx 84414.0774 104982.190444 0.261942
2015-08-05 xx 70499.8071 87368.524093 0.263748
我正在尝试根据exMarketplaces列修剪组级别的异常值。以下代码适用于整个数据框(无论品牌如何)。
df_clean = df[np.abs(df.exMarketplaces-df.exMarketplaces.mean())<=(3*df.exMarketplaces.std())]
但是我想在品牌层面完成此操作。因此,对于13个品牌中的每一个,此操作应该运行13次,结果将是单个数据框对象,并删除所有异常值。
有人可以提出这样做的方法吗?我有直觉,这是一件非常简单的事情,我在这里错过了一个技巧。
提前致谢。
答案 0 :(得分:1)
在品牌列中执行Groupby
并使用apply在感兴趣的列上运行该函数,最后获取数据框的已过滤子集,如下所示:
func = lambda x: (np.abs(x-x.mean()) <= 3*x.std())
df_clean = df[df.groupby('brand')['exMarketplaces'].apply(func)]