Pandas groupby聚合到新列

2024-10-04 15:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,看起来像这样:

A    B    C   D
1    10   22  14
1    12   20  37
1    11   8   18
1    10   10  6
2    11   13  4
2    12   10  12
3    14   0   5

一个看起来像这样的函数(注意:它实际上在做一些更复杂的事情,不容易分成三个独立的调用,但为了清晰起见,我简化了它):

^{pr2}$

我想在A和{}一起使用groupby来获得列B和{}(忽略{})的输出,如下所示:

                B               C
   min  mean  max  min  mean  max
A
1  10  10.75  12     8  15.0   22
2  11  11.50  12    10  11.5   13
3  14  14.00  14     0   0.0    0

我可以做以下事情:

df2.groupby('A')[['B','C']].agg(
    {
        'min':  lambda g: myfunc(g)[0],
        'mean': lambda g: myfunc(g)[1],
        'max':  lambda g: myfunc(g)[2]
    })

但除了这件事很难看,而且多次打电话给myfunc之外,我最后

  max       mean       min
    B   C      B     C   B   C
A
1  12  22  10.75  15.0  10   8
2  12  13  11.50  11.5  11  10
3  14   0  14.00   0.0  14   0

我可以使用.swaplevel(axis=1)来交换列级别,但是即使这样,B和{}也在多个重复的列中,对于多个函数调用,感觉就像是在错误的树上吠叫。在


Tags: 数据lambda函数myfuncminmean级别事情
2条回答

如果安排myfunc返回一个列为['A','B','C','D']且行索引为['min', 'mean', 'max']的数据帧,则可以使用groupby/apply调用函数(每个组一次)并根据需要连接结果:

import numpy as np
import pandas as pd

def myfunc(g):
    result = pd.DataFrame({'min':np.min(g),
                           'mean':np.mean(g),
                           'max':np.max(g)}).T
    return result

df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3],
 'B': [10, 12, 11, 10, 11, 12, 14],
 'C': [22, 20, 8, 10, 13, 10, 0],
 'D': [14, 37, 18, 6, 4, 12, 5]})

result = df.groupby('A')[['B','C']].apply(myfunc)
result = result.unstack(level=-1)
print(result)

印刷品

^{pr2}$

对于可能遇到此问题且不需要自定义函数的其他人,请注意 您应该始终使用builtin aggregators(下面,由 字符串'min''mean'和{})如果可能的话。他们的表现比 自定义Python函数。令人高兴的是,在这个玩具问题中,它产生了期望的结果:

In [99]: df.groupby('A')[['B','C']].agg(['min','mean','max'])
Out[99]: 
    B              C          
  min   mean max min  mean max
A                             
1  10  10.75  12   8  15.0  22
2  11  11.50  12  10  11.5  13
3  14  14.00  14   0   0.0   0

像这样的事情也许会奏效。在

df2.groupby('A')[['B','C']]
aggregated = df2.agg(['min', 'mean', 'max'])

然后可以使用swap level来交换列顺序

^{pr2}$

相关问题 更多 >

    热门问题