Я использую этот фрагмент кода для подсчета истинного времени недоступности в перекрывающихся аварийных сигналах, но только с одним столбцом в 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
...
Я приведу простой пример, поскольку вы можете видеть только окончательный ['Чистый'] как изменение, вызванное обработкой, другие нет.