Создать новый столбец из условия l oop (while, id списка, счетчик, отметка времени ...) - PullRequest
0 голосов
/ 09 марта 2020

Я хотел бы создать новый столбец отметки времени с этим фреймом данных:

                     Timestamp                          Flag
0  2019-10-21  07:48:28.272688                           end
1  2019-10-21  07:48:28.449916                           end 
2  2019-10-21  07:48:26.740378                         begin
3  2019-10-21  07:48:26.923764                         begin
4  2019-10-21  07:48:41.689466                           end
5  2019-10-21  07:48:37.306045                         begin
6  2019-10-21  07:58:00.774449                           end
7  2019-10-21  07:57:59.223986                         begin
8  2019-10-21  08:32:37.004455                           end
9  2019-10-21  08:32:35.755252                         begin

Принцип прост:

  1. Счетчик начинается с 0
  2. Для каждой строки, если у меня есть конец => счетчик + = 1 еще (у меня есть начало) => счетчик - = 1

  3. Когда счетчик == 0 => сохранить идентификатор метки времени в списке

  4. Когда счетчик = 0, следующая строка должна быть сохранена
  5. Когда l oop имеет конечное значение sh, заполните новое column 'New_Timestamp со значениями, соответствующими id столбца Timestamp.

Таким образом, результат должен быть:

                     Timestamp                          Flag
0  2019-10-21  07:48:28.272688                           end 
2  2019-10-21  07:48:26.740378                         begin
3  2019-10-21  07:48:26.923764                         begin
4  2019-10-21  07:48:41.689466                           end
5  2019-10-21  07:48:37.306045                         begin
6  2019-10-21  07:58:00.774449                           end
7  2019-10-21  07:57:59.223986                         begin
8  2019-10-21  08:32:37.004455                           end
9  2019-10-21  08:32:35.755252                         begin                        

Потому что: First end => counter = 1 (сохранить (первая строка), ct = 2, ct = 1 (сохранить), ct = 0 (сохранить), (сохранить) ct = 1; ct = 0 (сохранить) ...

В настоящее время я могу Не добавляйте соответствующие значения в идентификаторы, и, возможно, я забыл (а) условие (я) в своем коде.

Мой код:

counter = 0
i = 0

while i < len(df):

  id_timestamp_to_save = []


  if df.loc[i, 'Flag'] == 'end':
    counter +=1
    if counter == 1:
      id_timestamp_to_save = list(range(i))


  else:
    counter -=1
    if counter == 0:
      id_timestamp_to_save = list(range(i))


  df['New_Timestamp'] = df['New_Timestamp'].assign(id_timestamp_to_save)
  i+=1

Помогите мне, пожалуйста.

1 Ответ

0 голосов
/ 09 марта 2020

Согласно вашей логике c, просто замените end на 1 и begin на -1, затем cumsum:

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

Вывод:

                    Timestamp   Flag
0 2019-10-21  07:48:28.272688    end
3 2019-10-21  07:48:26.923764  begin
4 2019-10-21  07:48:41.689466    end
5 2019-10-21  07:48:37.306045  begin
6 2019-10-21  07:58:00.774449    end
7 2019-10-21  07:57:59.223986  begin
8 2019-10-21  08:32:37.004455    end
9 2019-10-21  08:32:35.755252  begin
...