对不同的列采取不同的功能

Taking Different Functions for Different Columns

我有以下数据集。

df = pd.DataFrame({'x': ['A','A','A','A','A','A','A','A','A','A',
                         'B','B','B','B','B','B','B','B','B','B'],
                   'ColA': [1,2,3,4,5,6,7,8,9,10,
                         1,2,3,4,5,6,7,8,9,10],
                   'ColB': np.random.randint(0,100,20),
                   'ColC': np.random.randint(0,100,20)})

我想按列 x 汇总列 ColAColBColC。但是每一列的汇总函数是不同的; ColAmax,列 ColBColCmean。我的预期输出如下:

summarization = df.groupby('x').agg({'ColA':'max', 'ColB':'mean', 'ColC':'mean'})
print(summarization)

ColA  ColB  ColC
x                  
A    10  52.5  54.9
B    10  64.1  51.0

这里的挑战是列名(ColB & ColC 是动态的)。此外,我可以有 3 列或 1 列而不是 2 列,我需要 mean(或 max)。因此,我需要将几列组合在一起以获取 meanmax.

理想的解决方案是,如果我可以这样做:

df.groupby('x').agg({'ColA':'max', ['ColB','ColC']:'mean'})

可惜agg函数没有这个功能

是的,agg 不支持使用列表来确定要对哪些列应用聚合,并且 dicts 不支持 lists 作为键。不过,如果你使用一些 list-comprehension 魔法,你可以:

aggs = [
    ('ColA', 'max'),
    (df.columns[2:], 'mean'),
]

aggs = dict(item for k,v in aggs for item in (((k,v),) if isinstance(k, str) else [(item,v) for item in k]))

summarization = df.groupby('x').agg(aggs)

输出:

>>> summarization
   ColA  ColB  ColC
x                  
A    10  49.1  52.8
B    10  53.1  49.9