У меня есть фрейм данных, содержащий более 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 результирующих кадров данных.Но мне кажется, что это не очень хорошее решение с точки зрения производительности - и тоже не выглядит элегантно.
Так как же это можно сделать более эффективно?