2016-06-25 13 views
0

Wie kann ich meine JSON-Daten in einen vernünftigen Datenrahmen bekommen? Ich habe eine tief verschachtelte Datei, die ich in einen großen Datenrahmen bringen möchte. Alles ist described im Github-Repository unter:Datenexploration JSON verschachtelte Daten in Pandas

http://www.github.com/simongraham/dataExplore.git

+3

Bitte stellen keine Verbindung zu einem externen Ressource mit großen Datendateien. Fügen Sie stattdessen eine repräsentative * Stichprobe * Ihrer Daten in Ihren Post ein. – BrenBarn

Antwort

1

Mit verschachtelten jsons, müssen Sie durch die Level gehen, benötigten Segmente zu extrahieren. Für die Ernährung Segment der größeren json, betrachten Iterieren durch alle nutritionPortions Ebene und jedes Mal die Pandas Normalisierung und verketten bis zur endgültigen Datenrahmen ausgeführt wird:

import pandas as pd 
import json 

with open('/Users/simongraham/Desktop/Kaido/Data/kaidoData.json') as f: 
    data = json.load(f) 

# INITIALIZE DF 
nutrition = pd.DataFrame() 

# ITERATIVELY CONCATENATE 
for item in data[0]["nutritionPortions"]:  
    if 'ftEnergyKcal' in item.keys():  # MISSING IN 3 OF 53 LEVELS 
     temp = (pd.io 
      .json 
      .json_normalize(item, 'nutritionNutrients', 
       ['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize', 
       'ftEnergyKcal', 'vcPortionUnit','dtConsumedDate']) 
      ) 
     nutrition = pd.concat([nutrition, temp]) 

nutrition.head() 

Ausgabe

ftValue nPercentRI vcNutrient     vcNutritionPortionId \ 
0  0.00   0.0  alcohol c993ac30-ecb4-4154-a2ea-d51dbb293f66 
1  0.00   0.0   bcfa c993ac30-ecb4-4154-a2ea-d51dbb293f66 
2  7.80   6.0  biotin c993ac30-ecb4-4154-a2ea-d51dbb293f66 
3 49.40   2.0  calcium c993ac30-ecb4-4154-a2ea-d51dbb293f66 
4  1.82   0.0 carbohydrate c993ac30-ecb4-4154-a2ea-d51dbb293f66 

    vcTrafficLight vcUnit  dtConsumedDate \ 
0      g 2016-04-12T00:00:00 
1      g 2016-04-12T00:00:00 
2     µg 2016-04-12T00:00:00 
3     mg 2016-04-12T00:00:00 
4      g 2016-04-12T00:00:00 

          vcNutritionId ftEnergyKcal \ 
0 070b97a4-d562-427d-94a8-1de1481df5d1   18.2 
1 070b97a4-d562-427d-94a8-1de1481df5d1   18.2 
2 070b97a4-d562-427d-94a8-1de1481df5d1   18.2 
3 070b97a4-d562-427d-94a8-1de1481df5d1   18.2 
4 070b97a4-d562-427d-94a8-1de1481df5d1   18.2 

           vcUserId vcPortionName vcPortionSize \ 
0 fe585e3d-2863-46fe-a41f-290bf58ad169   1 mug   260 
1 fe585e3d-2863-46fe-a41f-290bf58ad169   1 mug   260 
2 fe585e3d-2863-46fe-a41f-290bf58ad169   1 mug   260 
3 fe585e3d-2863-46fe-a41f-290bf58ad169   1 mug   260 
4 fe585e3d-2863-46fe-a41f-290bf58ad169   1 mug   260 

    vcPortionId vcPortionUnit 
0   2   ml 
1   2   ml 
2   2   ml 
3   2   ml 
4   2   ml 
+0

Danke @parfait, das funktioniert sehr reibungslos. Jetzt kann ich jede Spalte einzeln in einen Datenrahmen einlesen. Ist es eine gute Prozedur, dies zu tun und dann jeden Datenrahmen nebeneinander zu verketten? Oder wäre es am besten, wenn möglich alles auf einmal zu machen? – simongraham

+1

Gut zu hören! Verketten Sie Stacks, deren Datenrahmen nicht nebeneinander zusammenläuft. Diese normalisierte Prozedur benötigt eine eindeutige Menge und nicht alle. Hätten Sie nicht 'temp' verwendet, würden nur die allerletzten' nutritionPortions' beibehalten, da der Loop die 'nutrition' df ersetzt. – Parfait

Verwandte Themen