python按组

时间:2016-11-02 10:40:38

标签: python pandas

我有以下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次,结果将是单个数据框对象,并删除所有异常值。

有人可以提出这样做​​的方法吗?我有直觉,这是一件非常简单的事情,我在这里错过了一个技巧。

提前致谢。

1 个答案:

答案 0 :(得分:1)

品牌列中执行Groupby并使用apply在感兴趣的列上运行该函数,最后获取数据框的已过滤子集,如下所示:

func = lambda x: (np.abs(x-x.mean()) <= 3*x.std())
df_clean = df[df.groupby('brand')['exMarketplaces'].apply(func)]