Нет простого способа сделать это только с помощью методов Панд.Но вот довольно чистый подход:
columns = ['serial_no','timestamp','parameter1','parameter2','parameter3']
values = [['a001','2018-01-01 00:00:00',5,14,3],
['a001','2018-01-01 00:01:00',35,7,13],
['a002','2018-01-01 00:01:03',2,6,11],
['a002','2018-01-02 05:00:00',5,16,98],
['a003','2018-01-02 05:32:01',0,1.4,3]]
df = pd.DataFrame(values, columns=columns)
p_fields = ['parameter1', 'parameter2', 'parameter3']
serials = []
for sn, data in df.groupby('serial_no'):
serial = {}
serial['serial_no'] = sn
serial['readings'] = []
# Associate timestamps with parameter data
params = {p: zip(data.timestamp, data[p]) for p in p_fields}
readings = [{'name': p, 'datapoints': params[p]} for p in params]
serial['readings'] = readings
serials.append(serial)
serials[0]
{'readings': [{'datapoints': [('2018-01-01 00:00:00', 5),
('2018-01-01 00:01:00', 35)],
'name': 'parameter1'},
{'datapoints': [('2018-01-01 00:00:00', 3), ('2018-01-01 00:01:00', 13)],
'name': 'parameter3'},
{'datapoints': [('2018-01-01 00:00:00', 14.0), ('2018-01-01 00:01:00', 7.0)],
'name': 'parameter2'}],
'serial_no': 'a001'}