сначала отбросьте значения <= 90 и которые имеют предыдущее значение> 2 часа
установите менее чем 90 секунд в течение 2 часов на nan, заполните эти
некоторые фиктивные данные
time = pd.Series(np.random.randint(15e17, 15e17 + 1e16, 1000),
dtype='datetime64[ns]').sort_values()
values = np.random.normal(100, 5, 1000)
ids = np.random.choice(['a', 'b'], 1000)
df = pd.DataFrame({'id' :ids, 'time' : time, 'value' : values}, index=np.arange(1000))
метод, применяемый при группировке по идентификатору
def replace_data(df):
df['time_to_prev'] = df.time - df.time.shift()
df = df.loc[(df.value > 90) | (df.time_to_prev < pd.Timedelta(hours=2))]
df.loc[df.value < 90, 'value'] = np.NaN
df.value = df.value.ffill()
return df[['id', 'time', 'value']]
df.groupby(['id']).apply(replace_data).reset_index(drop=True)