Агрегирование всех столбцов в кадре данных - PullRequest
0 голосов
/ 19 октября 2018

У меня есть фрейм данных, содержащий более 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 Ответ

0 голосов
/ 19 октября 2018

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...