2015-04-24 97 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

不客氣...感謝您的錯字:-) –