Мои вопросы по этой теме двоякие (выделены жирным шрифтом): Я использую Dataframe для управления большим объемом данных в следующем формате:
Цель состоит в том, чтобы создать новый столбец, в котором будет храниться разница во времени от первого сообщения после сообщения «Старт» до первого сообщения «R». Этот цикл шаблона «Начало» для «Начала» повторяется тысячи раз в фрейме данных. Я помечаю строки, которые содержат первое после сообщения «Пуск», используя следующий код:
df['Shift'] = df['Data'].shift()
df['first_in_cycle'] = df['Shift'].str.contains('Start')
df.drop(columns='Shift', inplace=True)
Затем я пытаюсь отметить первое вхождение 'R, используя следующий код:
counter = (df['Data'].str.contains('Start')).cumsum()
first_r = df[df['Data'].str.contains('R')].groupby(counter).transform('idxmin')
df.loc[first_r.index, 'first_R'] = True
Однако результатом этого является фрейм данных, в котором все сообщения «R» помечены как истинные, что неверно. Я не знаю, как решить эту проблему.
План состоял в том, чтобы исправить оба столбца флагов, а затем объединить их с помощью .any(), удалив все строки, помеченные как ложные, а затем использовать .diff() для вычисления разницы между «R» и «Start». Это лучший способ добиться этого?
Ниже приведен желаемый результат для исходного примера:
@ShubhamSharma Между запусками всегда будет как минимум 1 сообщение R. Их может быть несколько или только один. Гарантия хоть одна. Мы
Использовать:
#create default index if necessary
df = df.reset_index(drop=True)
#check Start and R
m1 = df['Data'].str.contains('Start')
m2 = df['Data'].str.contains('R')
#groups by Start
g = m1.cumsum()
#get first R per groups to mask
mask1 = m2.groupby(g).transform('idxmax').eq(df.index)
#get Start + one row after Start
mask2 = m1.groupby(g).shift(fill_value=True)
#boolean indexing
df = df[mask1 | mask2]
#get difference per groups
df['Time Difference'] = df['Time'].groupby(g).diff().mask(mask2)
print (df)
Time Data Time Difference
0 1 Start NaN
1 2 1 NaN
4 5 R 3.0
6 7 Start NaN
7 8 3 NaN
8 9 R 1.0
Всегда ли за сообщением R следует Start? Я имею в виду, всегда ли есть фиксированный шаблон Start -> R -> Start -> R?