【问题标题】:returning aggregated dataframe from pandas groupby从 pandas groupby 返回聚合数据框
【发布时间】:2013-02-06 20:52:11
【问题描述】:

我正在尝试围绕 Pandas groupby 方法。我想编写一个函数来执行一些聚合函数,然后返回一个 Pandas DataFrame。这是一个使用 sum() 的非常简化的示例。我知道有更简单的方法来做简单的求和,在现实生活中我的函数更复杂:

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2':[1.0, 2, 3, 4]})

In [3]: df
Out[3]: 
  col1  col2
0    A     1
1    A     2
2    B     3
3    B     4

def func2(df):
    dfout = pd.DataFrame({ 'col1' : df['col1'].unique() ,
                           'someData': sum(df['col2']) })
    return  dfout

t = df.groupby('col1').apply(func2)

In [6]: t
Out[6]: 
       col1  someData
col1                 
A    0    A         3
B    0    B         7

我没想到那里有两次col1,我也没想到那个神秘索引的东西。我真的以为我会得到col1someData

在我的实际应用程序中,我按不止一列进行分组,并且真的很想取回 DataFrame 而不是 Series 对象。
在上面的示例中,关于 Pandas 正在做什么的解决方案或解释有什么想法吗?

-- 添加信息 -----

我想我应该从这个例子开始:

In [13]: import pandas as pd

In [14]: df = pd.DataFrame({'col1':['A','A','A','B','B','B'], 'col2':['C','D','D','D','C','C'], 'col3':[.1,.2,.4,.6,.8,1]})

In [15]: df
Out[15]: 
  col1 col2  col3
0    A    C   0.1
1    A    D   0.2
2    A    D   0.4
3    B    D   0.6
4    B    C   0.8
5    B    C   1.0

In [16]: def func3(df):
   ....:         dfout =  sum(df['col3']**2)
   ....:         return  dfout
   ....: 

In [17]: t = df.groupby(['col1', 'col2']).apply(func3)

In [18]: t
Out[18]: 
col1  col2
A     C       0.01
      D       0.20
B     C       1.64
      D       0.36

在上图中,apply() 函数的结果是 Pandas 系列。它缺少来自df.groupby 的groupby 列。我苦苦挣扎的本质是如何创建一个应用于 groupby 的函数,该函数返回函数的结果和分组的列?

--又一次更新------

看来,如果我这样做:

 pd.DataFrame(t).reset_index()

我得到了一个非常接近我所追求的数据框。

【问题讨论】:

  • 顺便说一句,本教程由一位 pandas 程序员帮助我了解了 pandas 的 groupby 和聚合机制:youtube.com/watch?v=MxRMXhjXZos
  • 在您附加的示例中,groupby 的目的是什么(它只会找到骗子),您可以对 df 本身进行应用并将其添加为列:df['func3'] = df.apply(lambda row: row['col2'] ** 2, axis=1) . ?
  • 这个例子的数据有点太简单了,恐怕。我将更新示例。
  • 我看不到一个示例,其中对所有列进行分组并应用而不是仅仅应用(DataFrames 应用可能非常重要并保存到多个列)是有意义的。 (另外你不需要创建一个 dfout 返回变量,你可以只返回计算,例如return df['col3']**2 :))
  • 示例已更新...现在可以使用了!天哪。似乎当应用在每一行上时它不会返回键,但如果应用导致聚合它确实返回键

标签: python group-by pandas


【解决方案1】:

您看到 0 列的原因是因为.unique() 的输出是一个数组

了解您的应用程序如何工作的最佳方法是逐组检查每个操作:

In [11] :g = df.groupby('col1')

In [12]: g.get_group('A')
Out[12]: 
  col1  col2
0    A     1
1    A     2

In [13]: g.get_group('A')['col1'].unique()
Out[13]: array([A], dtype=object)

In [14]: sum(g.get_group('A')['col2'])
Out[14]: 3.0

大多数情况下,您希望这是一个聚合的

grouped.apply 的输出将始终将组标签作为索引('col1' 的唯一值),因此您的 col1 示例构造对我来说似乎有点迟钝。

注意:要将'col1'(索引)弹出回一列,您可以调用reset_index,所以在这种情况下。

In [15]: g.sum().reset_index()
Out[15]: 
  col1  col2
0    A     3
1    B     7

【讨论】:

  • 对于我正在应用的任意函数,groupby 似乎从结果中删除了我的分组列并仅返回一系列答案。显然使用 sum() 方法可以解决这个问题,但是对于未作为 groupby 方法实现的自定义函数没有帮助。我在我的问题中添加了一个示例以更好地说明。
  • @JDlong 你在每一列都是分组吗? (对我来说,这似乎是一件奇怪的事情,但我同意输出有点奇怪:没有列的 MultiIndex):s
  • 不,在现实生活中,我可能会按 3 列分组,然后再计算 10 列。但是当我输出时,我想在结果中保留 groupby 键。
  • @JDLong 我明白了,这很奇怪!我认为 reset_index 在这种情况下有效。 (你能举个例子吗?)
猜你喜欢
  • 2021-01-22
  • 2017-06-07
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2014-11-23
  • 2022-01-21
  • 2019-08-10
相关资源
最近更新 更多