Для более быстрого выполнения вашей задачи определите следующую функцию:
def newFlag(grp):
tt = grp.timestamp
ind = np.nonzero(np.triu(np.absolute(tt[np.newaxis, :] - tt[:, np.newaxis]) <= 3600, 1))
tbl = grp.flag.values
tbl[np.concatenate(ind)] = 1
return pd.Series(np.where(np.isnan(grp.flag), tbl, grp.flag), index=grp.index)
Затем примените ее, сохранив результат в столбце flag :
df['flag'] = df.groupby('shop').apply(newFlag).reset_index(level=0, drop=True)
Скорость этого решения основана на группировке по магазин , поэтому вам не нужно сравнивать строки, относящиеся к разным магазинам.
Еще одним важным фактором, касающимся скорости, является использование Numpy функции, которые работают намного быстрее, чем Pandas.
Чтобы полностью понять все детали, запустите этот код шаг за шагом для выбранной группы строк ( для конкретного магазина ) и посмотрите результаты.