首页 文章

聚合数据框中的所有列

提问于
浏览
1

我有一个包含超过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 回答

  • 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
    

相关问题