2012-09-25 154 views
44

鑑於以下(完全矯枉過正)數據幀例如Python的熊貓:同一列

df = pandas.DataFrame({ 
         "date":[datetime.date(2012,x,1) for x in range(1,11)], 
         "returns":0.05*np.random.randn(10), 
         "dummy":np.repeat(1,10) 
         }) 

的多個聚合是有應用兩個不同的凝聚功能,以相同的列中的現有內置方式,而不必多次撥打agg

的語法錯誤,但直覺正確的,這樣做將是:

# Assume `function1` and `function2` are defined for aggregating. 
df.groupby("dummy").agg({"returns":function1, "returns":function2}) 

顯然,Python中不允許重複鍵。有沒有其他方式來表達對agg的輸入?也許元組列表[(column, function)]會更好,允許多個函數應用於同一列?但它似乎只接受字典。

是否有此規定之外,僅僅適用於兩種功能的它內部的輔助功能解決方法? (如何將與聚集這項工作呢?)

回答

51

你可以簡單地通過功能列表:

In [20]: df.groupby("dummy").agg({"returns": [np.mean, np.sum]}) 
Out[20]: 
     returns   
      sum  mean 

dummy      
1  0.285833 0.028583 

或作爲詞典:

In [21]: df.groupby('dummy').agg({'returns': 
            {'Mean': np.mean, 'Sum': np.sum}}) 
Out[21]: 
     returns   
      Sum  Mean 
dummy      
1  0.285833 0.028583 
+2

有沒有辦法指定結果列名? – Ben

+1

@Ben我認爲你必須在之後使用重命名。 [由湯姆奧格斯珀格(見細胞25)示例](http://nbviewer.ipython.org/gist/TomAugspurger/6e052140eaa5fdb6e8c0) –

+1

@Ben:我添加的例子此昨天 – bmu

3

會是這樣的工作:

In [7]: df.groupby('dummy').returns.agg({'func1' : lambda x: x.sum(), 'func2' : lambda x: x.prod()}) 
Out[7]: 
       func2  func1 
dummy       
1  -4.263768e-16 -0.188565 
+1

不,這是行不通的。如果您查看「聚合」文檔字符串,它明確指出,當傳遞「dict」時,鍵必須是列名稱。因此,無論您的示例是您輸入的內容而沒有檢查此錯誤,或者Pandas都會在此處打開自己的文檔。 – ely

+0

N/M我沒有在那裏看到額外的「返回」調用。那麼這是聚合的系列版本?我正在尋找聚合的DataFrame版本,我想一次將幾個不同的聚合應用到每個列。 – ely

+0

嘗試這種情況:df.groupby( '虛設')AGG({ '返回':{ '的func1':拉姆達X:x.sum(), 'FUNC2':拉姆達X:x.mean()}}) –