2012-09-25 110 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()}}) –