Вот одно из решений
n = 3
new_df = df.groupby(df.index//n).agg({'datetime': 'first', 'number': lambda x: x.tolist()})
new_df.assign(**(new_df.number.apply(pd.Series).add_prefix('#')))
datetime number #0 #1 #2
0 2015-07-06 00:00:00 [12, 55, 129] 12 55 129
1 2015-07-06 00:30:00 [5, 3017, 150] 5 3017 150
2 2015-07-06 01:00:00 [347, 8, 19] 347 8 19
Вы можете удалить числовой столбец
Редактировать: Как подсказывает @coldspeed, вы можете объединить два последних шага.
new_df = df.groupby(df.index//n).agg({'datetime': 'first', 'number': lambda x: x.tolist()})
new_df.assign(**(new_df.pop('number').apply(pd.Series).add_prefix('#')))
datetime #0 #1 #2
0 2015-07-06 00:00:00 12 55 129
1 2015-07-06 00:30:00 5 3017 150
2 2015-07-06 01:00:00 347 8 19