Python 3.x 聚合数据帧中的所有列
我有一个包含50多列和几百万行的数据框。我想根据其中一列进行分组,并为所有剩余列生成平均值和最大值。为了让它更容易理解,我粘贴了该数据帧的一个小片段:Python 3.x 聚合数据帧中的所有列,python-3.x,pandas,pandas-groupby,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,
{'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个结果数据帧。但我的直觉是,就性能而言,这不是一个好的解决方案——而且看起来也不优雅
那么,如何才能更有效地做到这一点呢?使用
谢谢你的快速回复。出于好奇:为什么要将行
df1.columns=df1.columns.map({0[0]}-{0[1]}.format)
替换为df1.columns=[''.join(col)for col in df1.columns.values]?
原始代码是正确的。你喜欢第二个版本有什么具体原因吗?@Nick我只是觉得第二个版本更容易理解。您可以使用任何一个。:)
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