Конвертировать dataframe в словарь, содержащий список словарей - PullRequest
0 голосов
/ 19 ноября 2018

Мой фрейм данных как показано

 name    key    value
 john    A223   390309
 jason   B439   230943
 peter   A5388  572039
 john    D23902 238939
 jason   F2390   23930

Я хочу преобразовать сгенерированный выше фрейм данных во вложенный словарь со списком словарей в указанном ниже формате.

{'john': [{'key':'A223', 'value':'390309'}, {'key':'A5388', 'value':'572039'}],
 'jason': [{'key':'B439','value':'230943', {'key':'F2390', 'value'2:'23930'}],
 'peter': [{'key':'A5388'  ,'value':'572039'}]}

Может кто-нибудь помочь с этим.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Использование dictionary comprehension с to_dict:

d = {name:df.loc[df.name==name,['key','value']].to_dict('records') for name in df.name.unique()}

print(d)
{'john': [{'key': 'A223', 'value': 390309}, {'key': 'D23902', 'value': 238939}], 
 'jason': [{'key': 'B439', 'value': 230943}, {'key': 'F2390', 'value': 23930}], 
 'peter': [{'key': 'A5388', 'value': 572039}]}
0 голосов
/ 19 ноября 2018

Вы можете использовать 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()
0 голосов
/ 19 ноября 2018

попробуйте это,

final_dict={}
def dict_make(row):
    m_k= row['name'].values.tolist()[0]
    final_dict[m_k]=  row.set_index('name').to_dict(orient='records')
df.groupby('name').apply(dict_make)
print final_dict

Выход:

{'peter': [{'value': 572039, 'key': 'A5388'}], 
'john': [{'value': 390309, 'key': 'A223'}, {'value': 238939, 'key': 'D23902'}],
'jason': [{'value': 230943, 'key': 'B439'}, {'value': 23930, 'key': 'F2390'}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...