将聚合值作为数据帧返回

时间:2017-02-27 15:03:32

标签: python pandas

我有一个已分组在两列上的pandas 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)

我希望结果是一个数据帧,例如列名为&#34; size&#34;和&#34;总和&#34;。我的聚合函数应该是什么样的,我还需要做些什么来访问结果的每一行的各个标签(列AB)?

2 个答案:

答案 0 :(得分:2)

您的聚合功能需要返回一个pandas系列。在这种情况下,整个groupby-apply将导致pandas DataFrame:

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

此处使用字典会自动标记最终结果数据框。

答案 1 :(得分:1)

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

尝试返回系列