У меня есть фрейм данных pandas
| Я БЫ | api_timestamp | уровень_события | |
|---|---|---|---|
| 0 | А9 | 2022-02-28 13:20:19.305 | NaN |
| 1 | А9 | 2022-02-28 13:20:21.703 | L1_1 |
| 2 | А9 | 2022-02-28 11:54:55.897 | L1_2 |
| 3 | А9 | 2022-02-28 12:18:00.882 | L1_3 |
| 4 | Б1 | 2022-02-28 12:18:04.882 | L1_1 |
| 5 | Б1 | 2022-02-28 12:18:05.882 | L1_6 |
| 6 | А9 | 2022-02-28 12:18:07.882 | L2_1 |
| 7 | А9 | 2022-02-28 12:18:08.882 | L1_8 |
Здесь у меня есть события на двух уровнях L1, например: L1_1, L1_2 и L2.
Как рассчитать количество событий L2 между парами событий L1 для каждого идентификатора
т.е. здесь для ID A9 есть один L2_1 между L1_3 и L1_8






Идея состоит в том, чтобы отсортировать столбец api_timestamp и найти событие L2 между событием L1, сравнив индекс события L2 и максимальный и минимальный индекс события L1.
df['api_timestamp'] = pd.to_datetime(df['api_timestamp'])
for name, g in df.dropna(subset='event_level').sort_values('api_timestamp', ignore_index=True).groupby('ID'):
l1_indices = g[g['event_level'].str[:2].eq('L1')].index.tolist()
l2_indices = g[g['event_level'].str.startswith('L2')].index.tolist()
l2_between = [l2 for l2 in l2_indices if l2 > min(l1_indices) and l2 < max(l1_indices)]
print(name, len(l2_between))
A9 1
B1 0