Я думаю, что нужно DataFrameGroupBy.agg
с помощью пользовательских функций, необходимо только как минимум 2 значения на группы для получения top2 из acceleration
:
#convert column to datetimes
df['date_time'] = pd.to_datetime(df['date_time'])
#create helper column for consecutive segment
s = df['Transportation_Mode'].ne(df['Transportation_Mode'].shift()).cumsum().rename('g')
#remove all non duplicated rows per segment
df = df[s.duplicated(keep=False)]
#get top1 and top2 values
f1 = lambda x: x.sort_values(ascending=False).iloc[0]
f1.__name__ = 'Top_1'
f2 = lambda x: x.sort_values(ascending=False).iloc[1]
f2.__name__ = 'Top_2'
d = {'date_time':['first','last'], 'Acceleration':['mean', f1, f2]}
df1 = df.groupby(['Trip_id','Transportation_Mode',s], sort=False).agg(d)
#flatenning MultiIndex in columns
df1.columns = df1.columns.map('_'.join)
#MultiIndex in index to columns
df1 = df1.reset_index(level=2, drop=True).reset_index()
print (df1)
Trip_id Transportation_Mode date_time_first date_time_last \
0 1 Walk 2017-05-26 10:21:00 2017-05-26 10:22:00
1 1 Bike 2017-05-26 10:25:00 2017-05-26 10:29:00
2 1 Walk 2017-05-26 10:31:00 2017-05-26 10:32:00
3 1 Car 2017-05-26 10:32:00 2017-05-26 10:34:00
4 2 Walk 2017-05-26 10:34:00 2017-05-26 10:34:00
5 2 Car 2017-05-26 10:36:00 2017-05-26 10:38:00
Acceleration_mean Acceleration_Top_1 Acceleration_Top_2
0 73.244598 186.630218 20.690278
1 795.671478 2921.070572 197.906415
2 361.342812 500.633699 409.393916
3 620.304746 1445.861393 298.458933
4 818.139796 1503.180990 133.098603
5 10.133954 12.370865 7.897043