Как применить этот счетчик к каждому ключу в поле данных dict? Python Pandas - PullRequest
0 голосов
/ 04 мая 2020

Я использую этот фрагмент кода для подсчета истинного времени недоступности в перекрывающихся аварийных сигналах, но только с одним столбцом в df:

counters = df_counter.Flag.map({'end':1,'begin':-1}).cumsum().eq(0)
final = df_counter[counters | counters.shift(fill_value=True)]
final = final.reset_index(drop=True)

Но на этот раз у меня есть такой запрос данных:

 u'Clean':                          Timestamp   Flag         group
 1      2019-10-21  07:39:28.052763  begin  Clean
 0      2019-10-21  07:39:58.332252    end  Clean
 4      2019-10-21  07:40:00.279654  begin  Clean
 5      2019-10-21  07:41:21.420687  begin  Clean
 2      2019-10-21  07:41:22.776254    end  Clean
 3      2019-10-21  07:41:58.631835    end  Clean
 u'Prod':                          Timestamp   Flag       group
 372    2019-10-21  16:51:50.091753    end  Prod
 375    2019-10-21  16:43:05.378102  begin  Prod
 429    2019-10-22  16:12:45.779011    end  Prod
 432    2019-10-22  16:07:49.442511  begin  Prod
'Main':                          Timestamp   Flag       group
 2237   2019-11-06  09:26:07.249828  begin  Main
 2236   2019-11-06  09:26:19.156940    end  Main
 2514   2019-11-20  11:52:28.765114  begin  Main
 2513   2019-11-20  11:52:40.295306    end  Main

Я хотел бы применить эту обработку для каждого ключа в поле данных, поэтому я попытался:

for key in DataFrameDict.keys():
    counters[key] = DataFrameDict[key].Flag.map({'end':1,'begin':-1}).cumsum().eq(0)
    final[key] = DataFrameDict[key][counters[key] | counters[key].shift(fill_value=True)]
    final[key] = final[key].reset_index(drop=True)

Но это не сработало ...

РЕДАКТИРОВАНИЕ: ожидаемый результат:

print(final['Clean'])
                         Timestamp   Flag  group
       2019-10-21  07:39:28.052763  begin  Clean
       2019-10-21  07:39:58.332252    end  Clean
       2019-10-21  07:40:00.279654  begin  Clean
       2019-10-21  07:41:58.631835    end  Clean

print(final['Main'])
                         Timestamp   Flag  group
       2019-11-06  09:26:07.249828  begin   Main
       2019-11-06  09:26:19.156940    end   Main
       2019-11-20  11:52:28.765114  begin   Main
       2019-11-20  11:52:40.295306    end   Main

print(final['Prod'])
                         Timestamp   Flag group
       2019-10-21  16:51:50.091753    end  Prod
       2019-10-21  16:43:05.378102  begin  Prod
       2019-10-22  16:12:45.779011    end  Prod
       2019-10-22  16:07:49.442511  begin  Prod
...

Я приведу простой пример, поскольку вы можете видеть только окончательный ['Чистый'] как изменение, вызванное обработкой, другие нет.

1 Ответ

0 голосов
/ 04 мая 2020

Ошибка связана с тем, что переменные counters и final не определены как словари:

counters = dict()
final = dict()

for key in DataFrameDict.keys():
    counters[key] = DataFrameDict[key].Flag.map({'end':1,'begin':-1}).cumsum().eq(0)
    final[key] = DataFrameDict[key][counters[key] | counters[key].shift(fill_value=True)]
    final[key] = final[key].reset_index(drop=True)


print(final)
# {'Clean':    id                   Timestamp   Flag  group
# 0   1  2019-10-21 07:39:28.052763  begin  Clean
# 1   0  2019-10-21 07:39:58.332252    end  Clean
# 2   4  2019-10-21 07:40:00.279654  begin  Clean
# 3   3  2019-10-21 07:41:58.631835    end  Clean,
# 'Prod':     id                   Timestamp   Flag group
# 0  372  2019-10-21 16:51:50.091753    end  Prod
# 1  375  2019-10-21 16:43:05.378102  begin  Prod
# 2  429  2019-10-22 16:12:45.779011    end  Prod
# 3  432  2019-10-22 16:07:49.442511  begin  Prod,
# 'Main':      id                   Timestamp   Flag group
# 0  2237  2019-11-06 09:26:07.249828  begin  Main
# 1  2236  2019-11-06 09:26:19.156940    end  Main
# 2  2514  2019-11-20 11:52:28.765114  begin  Main
# 3  2513  2019-11-20 11:52:40.295306    end  Main}
...