我正试着用分组的方法来环顾熊猫。我想编写一个函数来执行一些聚合函数,然后返回一个熊猫数据帧。下面是一个使用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出现,也没想到会出现神秘指数。我真的以为我会得到。
在我的实际应用程序中,我按多个列进行分组,我真的希望返回一个数据帧而不是一个序列对象。
在我上面的例子中,关于熊猫在做什么有什么解决方案或解释的想法吗?
-----添加的信息-----
我应该从这个例子开始,我想:
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

在上图中,col1函数的结果是熊猫系列。它缺少来自someData的groupby列。我正在努力解决的问题的本质是,如何创建一个应用于GroupBy的函数,GroupBy返回函数的结果和它所分组的列?
-----还有一个更新------
如果我这样做:
 pd.DataFrame(t).reset_index()

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

最佳答案

看到带有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示例构造对我来说有点迟钝。
注意:要弹出一列(索引),您可以调用它,所以在这种情况下。
In [15]: g.sum().reset_index()
Out[15]:
  col1  col2
0    A     3
1    B     7

关于python - 从pandas groupby返回聚合数据帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15003828/

10-13 07:23