繁体   English   中英

从pandas groupby返回聚合数据帧

[英]returning aggregated dataframe from pandas groupby

我正试着用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()

我找回了一个非常接近我所追求的数据帧。

您看到.unique() 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM