Вы можете использовать groupby , apply , iterrows и Series ' tolist , как показано ниже:
def f(rows):
return {rows.iloc[0]['name']: [{'key': row['key'], 'value': row['value']} for _, row in rows.iterrows()]}
df.groupby("name").apply(f).tolist()
Создание желаемых результатов:
[{'jason': [{'key': 'B439', 'value': '230943'}, {'key': 'F2390', 'value': '23930'}]},
{'john': [{'key': 'A223', 'value': '390309'}, {'key': 'D23902', 'value': '238939'}]},
{'peter': [{'key': 'A5388', 'value': '572039'}]}]
Пояснение:
- С
groupby("name")
мы агрегируем все строки за name
- Затем мы применяем функцию
f
к каждой из этих групп строк с apply(f)
f
перебирает эти строки с помощью iterrows
, создавая список словарей с [{'key': row['key'], 'value': row['value']} for _, row in rows.iterrows()]
и, наконец, мы берем только имя первой строки с rows.iloc[0]['name']
, чтобы создать окончательный словарь для этого name
.
- Мы объединяем все словари по
name
с tolist()