2015-04-24 120 views
5

我有一个数据帧:计算MAD(平均绝对差)的GroupBy熊猫

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 

我有类型[ 'A', 'B', 'C', 'd' 在我的数据帧所有这样的组合]和名称['X','Y','Z']。我用GROUPBY方法在特定的组合获得的统计在一起,就像A-X,A-Y,A-Z。这里的一些代码:

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 

我需要消除3个以上的MADS远的意见;喜欢的东西:

test = df[np.abs(df.Cost-df.Cost.mean())<=(3*df.Cost.mad())] 

我很困惑以此为df.Cost.mad()返回的整个数据,而不是特定的类型名称类别成本MAD。我怎么能把两者结合起来?

回答

3

您可以使用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] 

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

+0

谢谢,你和unutbu的答案会产生相同的结果,尽管你的结构更紧凑。最后一行有一个错字,应该以方括号结尾。 –

+0

不客气...感谢您的错字:-) –