<p>需要进行大量的整形,包括多个<code>groupby</code>、<code>apply</code>和<code>zip</code>:</p>
<pre><code>s = (df.groupby(["booking_id", "room_id", "room_name"])
.apply(lambda d: pd.Series({"guests": [{k: v for k,v in zip(["guest_type", "guest_name"], i)}
for i in d[["guest_type", "guest_name"]].values]}))
.reset_index(["room_id", "room_name"]) )
res = [[g, {'rooms': i.to_dict("records")}] for g, i in s.groupby(level=0)]
import pprint
pprint.pprint(res)
[[1,
{'rooms': [{'guests': [{'guest_name': 'John Doe',
'guest_type': 'adult'},
{'guest_name': 'John Noakes',
'guest_type': 'adult'}],
'room_id': 1,
'room_name': 'Standard Room'},
{'guests': [{'guest_name': 'Richard Miles',
'guest_type': 'adult'}],
'room_id': 2,
'room_name': 'Standard Room'}]}],
[2,
{'rooms': [{'guests': [{'guest_name': 'John Smith',
'guest_type': 'adult'},
{'guest_name': 'Joe Public',
'guest_type': 'adult'}],
'room_id': 1,
'room_name': 'Standard Room'}]}]]
</code></pre>