如何对pandas groupby的每个组应用不同的函数?

2 投票
2 回答
2613 浏览
提问于 2025-04-18 16:01

如果我有一个数据表,内容如下:

import numpy as np
import pandas as pd
df2 = pd.DataFrame({'type':['A', 'A', 'B', 'B', 'C', 'C'], 'value':np.random.randn(6)})
>>> df2
  type     value
0    A -1.136014
1    A -0.715392
2    B -1.961665
3    B -0.525517
4    C  1.358249
5    C  0.652092

我想根据“类型”这一列来分组这个数据表,并且对每个组应用不同的函数,比如对类型为A的组使用min(求最小值),对类型为B的组使用max(求最大值),对类型为C的组使用mean(求平均值)。

编辑于2014-08-05 12:00 GMT+8:

一些用户提供了很好的答案。但我使用分组的原因是因为我希望结果能保留在同一个数据表中,格式如下:

  type     value
0    A -1.136014
1    B -0.525517
2    C  1.005171

任何帮助都非常感谢~

2 个回答

0

为什么在这里还要用到 groupby 呢?这不是反而让事情变得复杂吗?而且你并不想对所有的组一起做什么。那么为什么不直接手动选择每个组呢?

>>> df2[df2.type=='A']['value'].min()
-1.4442888428898644
>>> df2[df2.type=='B']['value'].max()
1.0361392902054989
>>> df2[df2.type=='C']['value'].mean()
0.89822391958453074
2

我赞同abarnert的回答,因为这个回答很不错。

另一方面,为了按照提问者的要求来回答他们的问题:

for group in df2.groupby('type'):
    print group
    if group[0] == 'A':
        print group[1].min()
    if group[0] == 'B':
        print group[1].max()
    if group[0] == 'C':
        print group[1].mean()

我建议直接为每个组计算所有内容,因为这样做其实很简单。这就是进行分组操作的目的。

In [5]: summary = pd.DataFrame()

In [6]: summary['mean'] = df2.groupby('type').mean()['value']

In [7]: summary['min'] = df2.groupby('type').min()['value']

In [8]: summary['max'] = df2.groupby('type').max()['value']

summary 看起来会是这样的:

In [9]: summary
Out[9]: 
          mean       min       max
type                              
A     0.440490  0.231633  0.649346
B     0.172303  0.023094  0.321513
C     0.669650 -0.373361  1.712662

撰写回答