Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 聚合数据帧中的所有列_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

Python 3.x 聚合数据帧中的所有列

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,

我有一个包含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个结果数据帧。但我的直觉是,就性能而言,这不是一个好的解决方案——而且看起来也不优雅

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

使用


谢谢你的快速回复。出于好奇:为什么要将行
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