【问题标题】:Returning aggregated values as a dataframe将聚合值作为数据框返回
【发布时间】:2017-02-27 23:14:34
【问题描述】:

我有一个 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)

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您的聚合函数需要返回一个熊猫系列。在这种情况下,整个 groupby-apply 将产生一个 pandas DataFrame:

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

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

    【讨论】:

      【解决方案2】:
      def myfunc(grp):
          return pd.Series([len(grp), sum(grp["D"])])
      

      尝试返回系列

      【讨论】:

      • 谢谢,构建系列是缺少的成分。我对你们俩都投了赞成票,但我接受了@pansen 的回答,因为它包含更多功能。
      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 2011-06-29
      • 2021-12-18
      • 2018-04-13
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多