Python熊猫在多个列上执行相同的聚合

Python熊猫在多个列上执行相同的聚合,python,pandas,aggregate,Python,Pandas,Aggregate,我知道,在pandas中,我可以这样做,即对同一列应用多个聚合: import pandas as pd df = pd.DataFrame({'id':[1,1,2,2], 'x1':[0,1,0,1], 'x2':[1,0,1,0],'x3':[0,1,0,1], 'x4':[1,0,1,0]}) df.groupby('id').agg({'x1':['sum', 'max'], 'x2':['sum','max']}) 除了这次将相同的聚合应用于多个列之外,是否有语法快捷方式可以执行类

我知道,在pandas中,我可以这样做,即对同一列应用多个聚合:

import pandas as pd
df = pd.DataFrame({'id':[1,1,2,2], 'x1':[0,1,0,1], 'x2':[1,0,1,0],'x3':[0,1,0,1], 'x4':[1,0,1,0]})
df.groupby('id').agg({'x1':['sum', 'max'], 'x2':['sum','max']})
除了这次将相同的聚合应用于多个列之外,是否有语法快捷方式可以执行类似的操作?但是,我也希望执行多种类型的聚合

有效语法示例

df.groupby('id').agg({'x1':sum, 'x2':sum, 'x3':mean, 'x4':mean})
df.groupby('id').agg({['x1', 'x2']:sum, ['x3', 'x4']:mean})
期望结果示例

df.groupby('id').agg({'x1':sum, 'x2':sum, 'x3':mean, 'x4':mean})
df.groupby('id').agg({['x1', 'x2']:sum, ['x3', 'x4']:mean})

我知道这不是一个有效的键值对,但希望能说明我的目标。至于我为什么要这样做,我当前的聚合语句越来越长,我正在寻找缩短它的方法。

如果要在字典的键中使用
list
,它在python中无效


关闭,您需要的是在
groupby
之后指定列,但它仅适用于一个聚合函数:

df.groupby('id')['x1', 'x2'].sum()
或:


如果想要更动态的解决方案,可以创建元组字典,然后展平值,只需要元组中所有值都是唯一的,因为dict按定义具有唯一的键:

d = {('x1', 'x2'):['sum','max'], ('x3', 'x4'):'mean'}
d1 = {x:v for k, v in d.items() for x in k}
print (d1)
{'x1': ['sum', 'max'], 'x2': ['sum', 'max'], 'x3': 'mean', 'x4': 'mean'}

print (df.groupby('id').agg(d1))
    x1      x2       x3   x4
   sum max sum max mean mean
id                          
1    1   1   1   1  0.5  0.5
2    1   1   1   1  0.5  0.5

考虑使用
zip
对多列和聚合的等长列表/元组进行词典理解。然后将字典传递到
groupby().agg

cols = [['x1', 'x2'], ['x3', 'x4']]
aggs = ['sum', 'mean']

d = {c:a for col,a in zip(cols, aggs) for c in col}

df.groupby('id').agg(d) 
#     x1  x2   x3   x4
# id                  
# 1    1   1  0.5  0.5
# 2    1   1  0.5  0.5

这对单个聚合确实有效,但我意识到我需要更详细地更新我的问题。