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

У меня есть фрейм данных, в котором перечислены системные идентификаторы и количество аварийных сигналов определенных типов и классов, которые произошли в определенные даты:

df
                               SystemID         AlarmClass          AlarmType         Day  AlarmCount
0  95EE8B57-6BE9-4175-B901-B6B3BEE1844D            Service  Unexpected Status  06/08/2018           3
1  95EE8B57-6BE9-4175-B901-B6B3BEE1844D            Service  Unexpected Status  05/08/2018           2
2  95EE8B57-6BE9-4175-B901-B6B3BEE1844D            Service  Unexpected Status  06/08/2018           1
3  5F891F03-3114-4E62-9A7D-CD2A04061364            Service  Unexpected Status  04/08/2018           2
4  5F891F03-3114-4E62-9A7D-CD2A04061364            Service  Unexpected Status  04/08/2018           2
5  5F891F03-3114-4E62-9A7D-CD2A04061364  Event Log Monitor    Application Log  05/08/2018           2

Я хотел бы агрегировать эти данные, группируя их по SystemID и Day и перечисляяколичество сигналов тревоги каждого типа и класса.Результат для указанного выше фрейма данных будет выглядеть следующим образом:

                               SystemID         Day  AlarmClass-S  AlarmClass-ELM  AlarmType-US  AlarmType-AL
0  95EE8B57-6BE9-4175-B901-B6B3BEE1844D  06/08/2018             4               0             4             0
1  95EE8B57-6BE9-4175-B901-B6B3BEE1844D  05/08/2018             2               0             2             0
2  5F891F03-3114-4E62-9A7D-CD2A04061364  04/08/2018             4               0             4             0
3  5F891F03-3114-4E62-9A7D-CD2A04061364  05/08/2018             0               2             0             2

Как сделать это наиболее эффективно?Фрейм данных имеет миллионы записей.

1 Ответ

0 голосов
/ 26 сентября 2018

Для повышения производительности вы можете затем повернуть данные для каждого из AlarmClass и AlarmType и объединить результаты.

i = df.pivot_table(index=['SystemID', 'Day'], 
                   columns='AlarmClass', 
                   values='AlarmCount', 
                   aggfunc='sum', 
                   fill_value=0)
j = df.pivot_table(index=['SystemID', 'Day'], 
                   columns='AlarmType', 
                   values='AlarmCount', 
                   aggfunc='sum', 
                   fill_value=0)

i.columns = i.columns.map(lambda x: 'AlarmClass-' + ''.join(y[0] for y in x.split()))
j.columns = j.columns.map(lambda x: 'AlarmType-' + ''.join(y[0] for y in x.split()))

df = pd.concat([i, j], axis=1).reset_index()

print(df)
                               SystemID         Day  AlarmClass-ELM   \
0  5F891F03-3114-4E62-9A7D-CD2A04061364  04/08/2018               0             
1  5F891F03-3114-4E62-9A7D-CD2A04061364  05/08/2018               2             
2  95EE8B57-6BE9-4175-B901-B6B3BEE1844D  05/08/2018               0             
3  95EE8B57-6BE9-4175-B901-B6B3BEE1844D  06/08/2018               0             

AlarmClass-S  AlarmType-AL  AlarmType-US
           4             0             4
           0             2             0
           2             0             2
           4             0             4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...