web-dev-qa-db-fra.com

Json imbriqué dans pandas DataFrame avec un format spécifique

j'ai besoin de formater le contenu d'un fichier Json dans un certain format dans un pandas DataFrame afin que je puisse exécuter pandassql pour transformer les données et les exécuter via un modèle de notation.

file = C:\scoring_model\json.js (le contenu de 'file' est ci-dessous)

{
"response":{
  "version":"1.1",
  "token":"dsfgf",
   "body":{
     "customer":{
         "customer_id":"1234567",
         "verified":"true"
       },
     "contact":{
         "email":"[email protected]",
         "mobile_number":"0123456789"
      },
     "personal":{
         "gender": "m",
         "title":"Dr.",
         "last_name":"Muster",
         "first_name":"Max",
         "family_status":"single",
         "dob":"1985-12-23",
     }
   }
 }

J'ai besoin que le dataframe ressemble à ceci (évidemment toutes les valeurs sur la même ligne, ont essayé de le formater le mieux possible pour cette question):

version | token | customer_id | verified | email      | mobile_number | gender |
1.1     | dsfgf | 1234567     | true     | [email protected] | 0123456789    | m      |

title | last_name | first_name |family_status | dob
Dr.   | Muster    | Max        | single       | 23.12.1985

J'ai regardé toutes les autres questions sur ce sujet, j'ai essayé différentes façons de charger le fichier Json dans les pandas

`with open(r'C:\scoring_model\json.js', 'r') as f:`
    c = pd.read_json(f.read())

 `with open(r'C:\scoring_model\json.js', 'r') as f:`
    c = f.readlines()

essayé pd.Panel () dans cette solution Python Pandas: Comment diviser un dictionnaire trié dans une colonne d'une trame de données

avec les résultats de trame de données de [yo = f.readlines ()] a pensé à essayer de diviser le contenu de chaque cellule sur la base de ("") et de trouver un moyen de mettre le contenu divisé dans différentes colonnes mais pas de chance jusqu'à présent. Votre expertise est grandement appréciée. Merci d'avance.

28
figgy

Si vous chargez l'intégralité du json en tant que dict (ou liste), par ex. en utilisant json.load, vous pouvez utiliser json_normalize :

In [11]: d = {"response": {"body": {"contact": {"email": "[email protected]", "mobile_number": "0123456789"}, "personal": {"last_name": "Muster", "gender": "m", "first_name": "Max", "dob": "1985-12-23", "family_status": "single", "title": "Dr."}, "customer": {"verified": "true", "customer_id": "1234567"}}, "token": "dsfgf", "version": "1.1"}}

In [12]: df = pd.io.json.json_normalize(d)

In [13]: df.columns = df.columns.map(lambda x: x.split(".")[-1])

In [14]: df
Out[14]:
        email mobile_number customer_id verified         dob family_status first_name gender last_name title  token version
0  [email protected]    0123456789     1234567     true  1985-12-23        single        Max      m    Muster   Dr.  dsfgf     1.1
48
Andy Hayden