2014-12-05 88 views
1

我想使用groupby,但不是將相同的函數應用於每個組,而是要指定將哪個函數應用於哪個組值。我在這裏提供了一個非常簡單的例子來說明這一點,但實際上我的groupby變量有很多值,而且我的函數都是用戶定義的並且相當複雜 - 所以解決方案包括分別選擇每個組或應用同樣的功能對所有羣體都是不實際的。 (諸如此類的答案是提供這種非常類似的問題:how to apply different functions to each group of pandas groupby?,但他們並沒有解決我的問題)大熊貓使用groupby爲groupby的每個值應用不同的函數

df = DataFrame({'Category': ['A','A','A','B','B','B','C','C','C'], 
       'Total': [1, 2, 3, 1, 2, 3, 1, 2, 3]}) 

我希望能夠指定一個功能我GROUPBY變量的每個級別:

function_map = {'A': np.mean, 
       'B': np.max, 
       'C': np.min} 

我想做什麼就能做的是這樣的:

df.groupby('Category').apply(function_map) 

和結果的形式,我想應該是這樣的數據幀:

result = DataFrame({'Category': ['A','B','C'], 
       'Total': [2, 3, 1]}) 

回答

2

只是使用lambda,像這樣

df.groupby('Category').apply(lambda r: function_map[r.name](r.Total)) 

也,你應該使用numpy功能,因此np.meannp.maxnp.min

+0

這是有道理的,但我怎麼指定function_map使它包含有效的Python語法的函數?或者,或者,如果我將函數的名稱存儲爲字符串,那麼如何將它們作爲函數進行傳遞以應用? – eamcvey 2014-12-05 15:47:40

+0

我編輯我的問題使用numpy函數,如你所建議的,這使我可以爲function_map創建一個有效的字典。當我嘗試使用你的方法時,我得到一個錯誤:'TypeError:'系列'對象是可變的,因此它們不能被散列' – eamcvey 2014-12-05 15:53:27

+0

嘗試'r.Category.iloc [0]',所以你沒有通過整個系列。 – acushner 2014-12-05 19:07:32