Если вы используете ноутбук Юпитер, вы можете попробовать что-то вроде этого:
%timeit df.sort_values('Time').groupby(['Service', 'Command', 'Message_Type', 'Message_ID']).apply(lambda x: x.iloc[1]['Time'] - x.iloc[0]['Time'])
В моем примере у меня есть это:
2.97 ms ± 310 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
И я также думаю, что это хорошоплан =)