我有一个已分组在两列上的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;。我的聚合函数应该是什么样的,我还需要做些什么来访问结果的每一行的各个标签(列A
和B
)?
答案 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"])])
尝试返回系列