python - Pandas groupby 聚合到新列

标签 python pandas multi-index

我有一个看起来像这样的 DataFrame:

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

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

def myfunc(g):
    return min(g), mean(g), max(g)

我想在 A 上使用 groupbymyfunc 来获取 B 列的输出>C(忽略 D)是这样的:

                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) 来交换列级别,但即便如此,BC 也是重复的列,并且通过多个函数调用,感觉就像找错了树。

最佳答案

如果您安排 myfunc 返回一个 DataFrame,其列为 ['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)

打印

      B                  C            
    max   mean   min   max  mean   min
A                                     
1  12.0  10.75  10.0  22.0  15.0   8.0
2  12.0  11.50  11.0  13.0  11.5  10.0
3  14.0  14.00  14.0   0.0   0.0   0.0

对于可能遇到此问题且不需要自定义函数的其他人,请注意 您应该始终使用 builtin aggregators (下面,由 strings 'min', 'mean' and 'max') 如果可能的话。他们表现得比 自定义 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

关于python - Pandas groupby 聚合到新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42534806/

相关文章:

c# - 指定的可执行文件不是该操作系统平台的有效应用程序。

python - 在 GTK 应用程序中包含控制台应用程序

python - 在具有多个数字列的数据框中显示每个组的前 5 行

python - 使用多索引的二次 n 项方程

python - 按 0 级索引的最后一个值对 Pandas MultiIndex 进行排序

python - 下载CSV文件到客户端

python - Numpy 挤压 - 'list' 对象没有属性 'squeeze'

python - 'DataFrame' 对象没有属性 'sort'

python - Pandas - 每隔一行应用函数

python - 列表理解可以分为两个列表吗?