2016-06-25 3 views
0

JSON 데이터를 합리적인 데이터 프레임으로 가져 오려면 어떻게해야합니까? 나는 큰 데이터 프레임에 들어가기를 목표로 깊게 중첩 된 파일을 가지고있다. 모든 아래 Github의 저장소에 described입니다 :데이터 탐색 팬더의 JSON 중첩 데이터

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

+3

외부에 연결하지 마십시오 리소스가 큰 데이터 파일. 대신 게시물에 데이터의 대표적인 * 샘플 *을 포함 시키십시오. – BrenBarn

답변

1

중첩 jsons를 사용하면 필요한 세그먼트를 추출 수준을 걸어해야합니다. 더 큰 JSON의 영양 부문의 경우, 모든 nutritionPortions 수준을 반복하고 각 시간은 팬더의 정상화를 실행하고 최종 dataframe에 합치 고려 :

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() 

출력

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

매우 원활하게 작동하는 @parfait에게 감사드립니다. 이제 각 열을 데이터 프레임으로 개별적으로 파싱 할 수 있습니다. 이 작업을 수행 한 다음 각 데이터 프레임을 나란히 병합하는 것이 좋은 방법입니까? 또는 가능하다면이 모든 것을 한 번에 수행하는 것이 가장 좋을까요? – simongraham

+1

듣기 좋습니다! 각 데이터 프레임을 병합하여 병합하지 않습니다. 정규화 된 절차에는 모두가 아니라 하나의 별개의 집합이 필요합니다. 당신이'temp'를 사용하지 않았다면'nutritionPortions'의 마지막 부분 만 루프가'영양 'df를 대체하기 때문에 유지 될 것입니다. – Parfait

관련 문제