我有一个包含超过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得到的数据帧。但是我的直觉是,就性能而言,这不是一个很好的解决方案-也不美观。
那么如何才能更有效地做到这一点?
答案 0 :(得分:1)
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