Me gustaría convertir mi DataFrame en un JSON específico. Intento usar to_dict () pero por el momento no encontré los parámetros correctos para replicar la salida.

¿Tienes idea?

Mi código :

import pandas as pd
data = {
    'alt' : ["BeattheBeachmark NEW", "BeattheBeachmark NEW"],
    'Mod' : ["GA", "GA"],
    'Pers' : ["Movment", "Movment"],
    'Vie' : ["Inprogress", "Inprogress"],
    'Actions' : ["Clear", "Add"]
}

df = pd.DataFrame(data)

Mi salida:

result = {
    "alt" : {
        "BeattheBeachmark NEW" : {
            "Mod" : {
                "GA" :  {
                    "Pers" : {
                        "Movment" : {
                            "Vie" : {
                                "Inprogress" : {
                                    'Actions' : ["Clear", "Add"]
                                }
                            }
                        }
                    }

                }
            }

        }
    }
}
1
Flo Cp 5 oct. 2021 a las 11:03

2 respuestas

La mejor respuesta

Puede agrupar su marco de datos por "alt", por "Mod" ... y así sucesivamente y crear su diccionario a lo largo del camino:

import pandas as pd
import json
data = {
    'alt' : ["BeattheBeachmark NEW", "BeattheBeachmark NEW"],
    'Mod' : ["GA", "GA"],
    'Pers' : ["Movment", "Movment"],
    'Vie' : ["Inprogress", "Inprogress"],
    'Actions' : ["Clear", "Add"]
}

df = pd.DataFrame(data)
output_dict = dict()
output_dict['alt'] = dict()

for alt in df.groupby("alt"):
    output_dict['alt'][alt[0]] = dict()
    output_dict['alt'][alt[0]]["Mod"] = dict()
    for mod in alt[1].groupby("Mod"):
        output_dict['alt'][alt[0]]["Mod"][mod[0]] = dict()
        output_dict['alt'][alt[0]]["Mod"][mod[0]]["Pers"] = dict()
        for pers in mod[1].groupby("Pers"):
            output_dict['alt'][alt[0]]["Mod"][mod[0]]["Pers"][pers[0]] = dict()
            output_dict['alt'][alt[0]]["Mod"][mod[0]]["Pers"][pers[0]]["Vie"] = dict()
            for vie in pers[1].groupby("Vie"):
                output_dict['alt'][alt[0]]["Mod"][mod[0]]["Pers"][pers[0]]["Vie"][vie[0]] = dict()
                output_dict['alt'][alt[0]]["Mod"][mod[0]]["Pers"][pers[0]]["Vie"][vie[0]]["Actions"] = list(vie[1].Actions)

print(json.dumps(output_dict, indent=4))

Salida:

{
    "alt": {
        "BeattheBeachmark NEW": {
            "Mod": {
                "GA": {
                    "Pers": {
                        "Movment": {
                            "Vie": {
                                "Inprogress": {
                                    "Actions": [
                                        "Clear",
                                        "Add"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
1
Tranbi 5 oct. 2021 a las 09:16

Para obtener el mismo diccionario que en su ejemplo, puede iterar a través de las columnas de su marco de datos y crear el diccionario como tal (usando la evaluación literal para ayudar desde df.to_json devuelve una cadena y desea una lista):

import ast
your_dict = {}

for col in df.columns:
    your_dict[col] = df[col].to_json(orient='records')
    your_dict[col] = ast.literal_eval(your_dict[col])

print(your_dict)

Dandote:

{'alt': ['BeattheBeachmark NEW', 'BeattheBeachmark NEW'],
 'Mod': ['GA', 'GA'],
 'Pers': ['Movment', 'Movment'],
 'Vie': ['Inprogress', 'Inprogress'],
 'Actions': ['Clear', 'Add']}
0
vtasca 5 oct. 2021 a las 08:17