Estoy ejecutando Python 3.6 y Pandas 0.19.2 y tengo un DataFrame que tiene el siguiente aspecto:
Name Chain Food Healthy George McDonalds burger False George KFC chicken False John Wendys burger False John McDonalds salad TrueQuiero transformar este marco de datos en un dictado que se vea de la siguiente manera:
health_data = {'George': {'McDonalds': {'Food': 'burger', 'Healthy':False}, 'KFC': {'Food': 'chicken', 'Healthy':False}}, 'John': {'Wendys': {'Food': 'burger', 'Healthy':False}, 'McDonalds': {'Food': 'salad', 'Healthy': True}}}Mis pensamientos hasta ahora son:
df.groupby para agrupar la columna de nombresdf.to_dict() para transformar el marco de datos en un diccionario como: health_data = input_data.set_index('Chain').T.to_dict()¿Pensamientos? Gracias de antemano por la ayuda.
Creo que estabas muy cerca.
df = df.groupby('Name')[['Chain','Food','Healthy']] .apply(lambda x: x.set_index('Chain').to_dict(orient='index')) .to_dict() print (df) {'George': {'KFC': {'Healthy': False, 'Food': 'chicken'}, 'McDonalds': {'Healthy': False, 'Food': 'burger'}}, 'John': {'McDonalds': {'Healthy': True, 'Food': 'salad'}, 'Wendys': {'Healthy': False, 'Food': 'burger'}}}Solución usando comprensión de diccionario y groupby :
{n: grp.loc[n].to_dict('index') for n, grp in df.set_index(['Name', 'Chain']).groupby(level='Name')} {'George': {'KFC': {'Food': 'chicken', 'Healthy': False}, 'McDonalds': {'Food': 'burger', 'Healthy': False}}, 'John': {'McDonalds': {'Food': 'salad', 'Healthy': True}, 'Wendys': {'Food': 'burger', 'Healthy': False}}} Solución usando defaultdict :
from collections import defaultdict d = defaultdict(dict) for i, row in df.iterrows(): d[row.Name][row.Chain] = row.drop(['Name', 'Chain']).to_dict() dict(d) {'George': {'KFC': {'Food': 'chicken', 'Healthy': False}, 'McDonalds': {'Food': 'burger', 'Healthy': False}}, 'John': {'McDonalds': {'Food': 'salad', 'Healthy': True}, 'Wendys': {'Food': 'burger', 'Healthy': False}}}