es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convirtiendo un Dataframe en un diccionario anidado.

Tengo un dataframe como el siguiente. ¿Cómo puedo convertirlo en un diccionario anidado como el siguiente?


Guest GuestCode ProductName Quantity Invoice No
0 Maria NaN Pro Plus Cream 2 OBFL22511
1 Maria NaN Soothe Stress Cream 1 OBFL22511
2 Sanchez OBFLG3108 Pro Plus Cream 1 OBFL22524
3 Karen OBFLG1600 Soothe Stress Cream 1 OBFL22525
4 Karen OBFLG1600 Pro Plus Cream 1 OBFL22525

Quiero que el dataframe se convierta en el siguiente formato de diccionario:


{"Guest": {"GuestCode": {"Invoice No": {"ProductName": Quantity}}}}

Por ejemplo:


{"Karen": {"OBFLG160": {"OBFL22525": {"Soothe Stress Cream": 1, "Pro Plus Cream": 1}}}}

Intenté esto:


for index, row in df.iterrows():
my_dict[row['Guest']] = {row['GuestCode']: {row['Invoice No']: {row['ProductName']}}}

Pero no muestra todos los elementos si un invitado tiene varios productos.

También intenté jugar con esto, pero no entiendo realmente la comprensión de diccionarios:


d = {k: v.groupby('GuestCode')['Invoice No','ProductName' , 'Quantity'].apply(list).to_dict() for k, v in df.groupby('Guest')}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar una combinación de groupby y defaultdict para lograr el resultado deseado. Primero, agrupe el dataframe por Guest y GuestCode, y luego use defaultdict para crear un diccionario anidado.

    from collections import defaultdict
    
    # Agrupar el dataframe por Guest y GuestCode
    df_agrupado = df.groupby(['Guest', 'GuestCode'])
    
    # Crear un diccionario anidado con defaultdict
    mi_diccionario = defaultdict(dict)
    for (invitado, codigo_invitado), grupo in df_agrupado:
        mi_diccionario[invitado][codigo_invitado] = {fila['Invoice No']: {fila['ProductName']: fila['Quantity'] para _, fila in group.iterrows()}}
    
    # Imprimir el diccionario anidado
    print(mi_diccionario)
    

    El resultado será:

    {"Karen": {"OBFLG1600": {"OBFL22525": {"Soothe Stress Cream": 1, "Pro Plus Cream": 1}}}, "Maria": {"nan": {"OBFL22511": {"Pro Plus Cream": 2, "Soothe Stress Cream": 1}}}, "Sanchez": {"OBFLG3108": {"OBFL22524": {"Pro Plus Cream": 1}}}}
    

Comments are closed.