计算MAD(平均绝对偏差)GroupBy Pandas

时间:2015-04-24 11:44:13

标签: python pandas group-by dataframe aggregate

我有一个数据框:

 Angular JS version using :1.3.15 . 
 Rest api call is not triggering from angular to Rest Back end and not getting any error in back End.
 Error getting in the angular js :
      unexpected Request PUT No more request expected
                           at $httpBackend (angular-mocks.js:1180)
                           at m (angular.js:9628)
                           at $get.f (angular.js:9344)
                           at angular.js:13189
                           at l.$get.l.$eval (angular.js:14401)
                           at l.$get.l.$digest (angular.js:14217)
                           at l.$get.l.$apply (angular.js:14506)
                           at HTMLButtonElement.<anonymous> (ionic-angular.js:9958)
                           at HTMLButtonElement.c (angular.js:3014)
                           at triggerMouseEvent (ionic.js:2804) 

我的数据框中有所有这些组合,类型为['A','B','C','D']和名称['X','Y','Z']。我使用groupby方法获取特定组合的统计数据,如 A-X,A-Y,A-Z 。这是一些代码:

Type Name Cost
  A   X    545
  B   Y    789
  C   Z    477
  D   X    640
  C   X    435
  B   Z    335
  A   X    850
  B   Y    152

我需要消除超过3个MAD的观察结果;类似的东西:

df = pd.DataFrame({'Type':['A','B','C','D','C','B','A','B'] ,'Name':['X','Y','Z','X','X','Z','X','Y'], 'Cost':[545,789,477,640,435,335,850,152]})
df.groupby(['Name','Type']).agg([mean,std])  
#need to use mad instead of std  

我对此感到困惑,因为df.Cost.mad()返回整个数据上的Cost的MAD而不是特定的Type-Name类别。我怎么能把两者结合起来?

2 个答案:

答案 0 :(得分:4)

您可以使用groupbytransform创建可用于过滤数据的新数据系列。

groups = df.groupby(['Name','Type'])
mad = groups['Cost'].transform(lambda x: x.mad())
dif = groups['Cost'].transform(lambda x: np.abs(x - x.mean()))
df2 = df[dif <= 3*mad]

然而,在这种情况下,没有过滤掉任何行,因为差异等于平均绝对偏差(这些组最多只有两行)。

答案 1 :(得分:0)

您可以在分组对象上获得聚合函数:

df["mad"] = df.groupby(['Name','Type'])["Cost"].transform("mad")
df = df.loc[df.mad<3]