Python熊猫在多个列上执行相同的聚合
我知道,在pandas中,我可以这样做,即对同一列应用多个聚合: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']}) 除了这次将相同的聚合应用于多个列之外,是否有语法快捷方式可以执行类
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
这对单个聚合确实有效,但我意识到我需要更详细地更新我的问题。