汇总数据框中的所有列

时间:2018-10-19 16:01:21

标签: python-3.x pandas pandas-groupby

我有一个包含超过50列和几百万行的数据框。我想根据其中一列进行分组,并为其余所有列生成平均值和最大值。为了使其更易于理解,我粘贴了该数据框的一小段代码:

{'SystemID': {0: '95EE8B57',
1: '95EE8B57',
2: '5F891F03',
3: '5F891F03'},
'Day': {0: '06/08/2018', 1: '05/08/2018', 2: '04/08/2018', 3: '05/08/2018'},
'AlarmClass-S': {0: 4, 1: 2, 2: 4, 3: 0},
'AlarmClass-ELM': {0: 0, 1: 0, 2: 0, 3: 2}}

输出应为

{'SystemID': {0: '95EE8B57',
1: '5F891F03'},
'AlarmClass-S-mean': {0: 3, 1: 2},
'AlarmClass-S-max': {0: 4, 1: 4},
'AlarmClass-ELM-mean': {0: 0, 1: 1},
'AlarmClass-ELM-max': {0: 0, 1: 2}
}

在这种特殊情况下,对SystemID进行分组。除“天”外,其余所有列均进行汇总(平均值,最大值)。

如何有效地做到这一点?

我有一个函数,该函数采用列名并生成具有该列的聚合(平均值,最大值)的数据框:

def mean_max(df, col_group, col_agg):
df_group = df.reset_index()[[col_group, col_agg]].groupby([col_group]).agg({col_agg:{col_agg + '_mean': 'mean', col_agg + '_max': 'max'}})
df_group.columns = df_group.columns.droplevel(0)
return df_group;

从理论上讲,我可以在所有+50列上迭代运行此函数,然后合并+50得到的数据帧。但是我的直觉是,就性能而言,这不是一个很好的解决方案-也不美观。

那么如何才能更有效地做到这一点?

1 个答案:

答案 0 :(得分:1)

使用groupby.agg

cols = [i for i in df.columns if i != 'Day']
df1 = df.groupby('SystemID')[cols].agg(['mean','max'])

df1.columns = [' '.join(col) for col in df1.columns.values]

print (df1)

       AlarmClass-S mean    AlarmClass-S max  AlarmClass-ELM mean  AlarmClass-ELM max
SystemID                
5F891F03      2                   4                     1                 2
95EE8B57      3                   4                     0                 0