2017-02-27 108 views
0

我有一个熊猫DataFrame已被分组在两列,以及一个自定义函数,计算每个分组的行集的值的元组。 我想收集一个数据框中的结果,用原始组索引编制索引。当我使用apply()时,我得到一个Series具有正确的索引,但具有元组形式的值。我应该如何编写我的函数才能使结果成为一个数据框,并按照每个组的标签进行索引?作为数据框返回聚合值

下面是基于教程中的数据框的示例。

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 
          'two', 'two', 'one', 'three'], 
        'C' : 1, 
        'D' : range(0, 8) }) 
groups = df.groupby(("A", "B")) 

def myfunc(grp): 
    return len(grp), sum(grp["D"]) 

result = groups.apply(myfunc) 

print(type(result)) 
print(result) 

输出:

<class 'pandas.core.series.Series'> 
A B  
bar one  (1, 4) 
    three  (1, 8) 
    two  (1, 12) 
foo one  (2, 16) 
    three (1, 16) 
    two  (2, 16) 

我想的结果是一个数据帧,例如列名为“大小”和“总和”。我的聚合函数应该是什么样的,我还需要做什么来访问结果的每一行的单个标签(列AB)?

回答

2

您的聚合函数需要返回一个熊猫系列。在这种情况下,整体GROUPBY申请将导致大熊猫数据帧:

def myfunc(grp): 
    return pd.Series({"size": len(grp), "sum": sum(grp["D"])}) 

使用字典自动在这里你的标签最终结果的数据帧。

+0

的字典就是爽! –

1
def myfunc(grp): 
    return pd.Series([len(grp), sum(grp["D"])]) 

,请返回系列

+1

谢谢你,构建一个系列是缺少的成分。我向你们提出了两项​​建议,但我接受了@潘森的答案,因为它包含更多功能。 – alexis