Создать последовательный идентификатор события для групп последовательных - PullRequest
1 голос
/ 07 января 2020

У меня есть df примерно так:

Period  Count
1       1
2       0
3       1
4       1
5       0
6       0
7       1
8       1
9       1
10      0

, и я хочу вернуть 'Event ID' в новом столбце, если есть два или более последовательных вхождения: 1 в Count и 0, если есть не является. Таким образом, в новом столбце каждая строка получит 1 на основе этого критерия, встречающегося в столбце Count. Тогда мой желаемый результат будет таким:

Period  Count  Event_ID
1       1      0
2       0      0
3       1      1
4       1      1
5       0      0
6       0      0
7       1      2
8       1      2
9       1      2
10      0      0

Я исследовал и нашел решения, которые позволяют мне выделять последовательную группу похожих чисел (например, 1), но я еще не нашел того, что мне нужно. Я хотел бы иметь возможность использовать этот метод для подсчета любого количества последовательных вхождений, а не только 2. Например, иногда мне нужно сосчитать 10 последовательных вхождений, я просто использую 2 в примере здесь.

1 Ответ

0 голосов
/ 07 января 2020

Это сделает работу:

ones = df.groupby('Count').groups[1].tolist()
# creates a list of the indices with a '1': [0, 2, 3, 6, 7, 8]
event_id = [0] * len(df.index)
# creates a list of length 10 for Event_ID with all '0'

# find consecutive numbers in the list of ones (yields [2,3] and [6,7,8]):
for k, g in itertools.groupby(enumerate(ones), lambda ix : ix[0] - ix[1]):
  sublist = list(map(operator.itemgetter(1), g))
  if len(sublist) > 1:
    for i in sublist:
      event_id[i] = len(sublist)-1    
# event_id is now [0, 0, 1, 1, 0, 0, 2, 2, 2, 0]   

df['Event_ID'] = event_id

Значение для l oop адаптировано из этого примера (при использовании itertools возможны и другие подходы).

...