2016-06-23 47 views
5

Ora ho aggiunto il problema corrente su GitHib. Si prega di trovare l'URL per il repo. Ho incluso un taccuino Jupyter che spiega anche il problema. Grazie ragazzi.visualizzazione di dati JSON nidificati in un dataframe panda

https://github.com/simongraham/dataExplore.git


Attualmente sto lavorando con i dati nutrizionali per un progetto, in cui i dati sono in formato JSON cruda, e voglio usare Python e panda per ottenere un frame di dati comprensibile. Capisco che questo è un compito facile quando il JSON non è annidato. Qui vorrei usare:

nutrition = pd.read_json('data') 

Tuttavia, ho annidato le informazioni e trovo molto difficile inserirlo in un frame di dati ragionevole. Il formato JSON è il seguente, in cui l'elemento nutritionNutrients stesso è un elemento nidificato. Il nido per questo elemento descriverà i contenuti nutrizionali per una varietà di cose diverse come l'alcol e il bcfa, come incluso. Ho incluso solo un esempio perché si tratta di un file di dati di grandi dimensioni.

[ 
     { 
      "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
      "vcNutritionId": "2476378b-79ee-4857-a81d-489661a039a1", 
      "vcUserId": "cc51145b-5a70-4344-9b55-1a4455f0a9d2", 
      "vcPortionId": "1", 
      "vcPortionName": "1 average pepper", 
      "vcPortionSize": "20", 
      "ftEnergyKcal": 5.2, 
      "vcPortionUnit": "g", 
      "dtConsumedDate": "2016-05-04T00:00:00", 
      "nutritionNutrients": [ 
       { 
        "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
        "vcNutrient": "alcohol", 
        "ftValue": 0, 
        "vcUnit": "g", 
        "nPercentRI": 0, 
        "vcTrafficLight": "" 
       }, 
       { 
        "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
        "vcNutrient": "bcfa", 
        "ftValue": 0, 
        "vcUnit": "g", 
        "nPercentRI": 0, 
        "vcTrafficLight": "" 
       }, 
       { 
        "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
        "vcNutrient": "biotin", 
        "ftValue": 0, 
        "vcUnit": "µg", 
        "nPercentRI": 0, 
        "vcTrafficLight": "" 
       }, 
       ... 
      ] 
     } 
    ] 

Qualsiasi aiuto sarebbe apprezzato.

Grazie.

.... ....

Ora che ho trovato il modo di risolvere questo problema utilizzando json_normalize, mi restituiscono lo stesso problema, ma questa volta il mio codice è nidificato due volte. Vale a dire:

[ 
{ 
... 
} 
[, 
"nutritionPortions": [ 
    { 
     "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
     "vcNutritionId": "2476378b-79ee-4857-a81d-489661a039a1", 
     "vcUserId": "cc51145b-5a70-4344-9b55-1a4455f0a9d2", 
     "vcPortionId": "1", 
     "vcPortionName": "1 average pepper", 
     "vcPortionSize": "20", 
     "ftEnergyKcal": 5.2, 
     "vcPortionUnit": "g", 
     "dtConsumedDate": "2016-05-04T00:00:00", 
     "nutritionNutrients": [ 
      { 
       "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
       "vcNutrient": "alcohol", 
       "ftValue": 0, 
       "vcUnit": "g", 
       "nPercentRI": 0, 
       "vcTrafficLight": "" 
      }, 
      { 
       "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
       "vcNutrient": "bcfa", 
       "ftValue": 0, 
       "vcUnit": "g", 
       "nPercentRI": 0, 
       "vcTrafficLight": "" 
      }, 
      { 
       "vcNutritionPortionId": "478d1905-f264-4d9b-ab76-0ed4252193fd", 
       "vcNutrient": "biotin", 
       "ftValue": 0, 
       "vcUnit": "µg", 
       "nPercentRI": 0, 
       "vcTrafficLight": "" 
      }, 
      ... 
      } 
      ] 
     } 
     ] 

Quando ho un JSON composto da solo i dati nutrizione posso usare:

nutrition = (pd.io 
    .json 
    .json_normalize((data, ['nutritionPortions']), 'nutritionNutrients', 
     ['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize', 
     'ftEnergyKcal','vcPortionUnit','dtConsumedDate']) 
) 

Tuttavia, il mio dati non solo contiene informazioni nutrizionali. Ad esempio conterrà informazioni sull'attività e quindi le informazioni nutrizionali sono annidate con "nutrtitionPortions" all'inizio. Supponiamo che tutte le altre colonne non siano nidificate e che siano rappresentate da "Attività" e "Benessere".

Se uso il codice:

nutrition = (pd.io 
    .json 
    .json_normalize(data, ['nutritionPortions']) 
) 

tornerò al problema originale dove "nutritionNutrients" è annidati, ma sto avendo alcun successo poi ottenere il corrispondente frame di dati.

Grazie

risposta

4

UPDATE: questo dovrebbe funzionare per il vostro file di kaidoData.json:

df = (pd.io 
     .json 
     .json_normalize(data[0]['ionPortions'], 'nutritionNutrients', 
      ['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize', 
      'dtCreatedDate','dtUpdatedDate','nProcessingStatus', 
      'vcPortionUnit','dtConsumedDate' 
      ] 
     ) 
) 

PS non so che cosa è sbagliato con il 'ftEnergyKcal' - mi getta:

KeyError: 'ftEnergyKcal'

forse manca in alcune sezioni

risposta VECCHIO:

uso json_normalize():

(pd.io 
    .json 
    .json_normalize(l, 'nutritionNutrients', 
     ['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize', 
     'ftEnergyKcal','vcPortionUnit','dtConsumedDate']) 
) 

demo:

In [107]: (pd.io 
    .....: .json 
    .....: .json_normalize(l, 'nutritionNutrients', 
    .....:   ['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize', 
    .....:   'ftEnergyKcal','vcPortionUnit','dtConsumedDate']) 
    .....:) 
Out[107]: 
    ftValue nPercentRI vcNutrient vcNutritionPortionId vcTrafficLight  ...  vcPortionSize \ 
0  0   0 alcohol 478d1905-f264-4d...      ...     20 
1  0   0  bcfa 478d1905-f264-4d...      ...     20 
2  0   0  biotin 478d1905-f264-4d...      ...     20 

     vcNutritionId vcPortionId ftEnergyKcal  vcPortionName 
0 2476378b-79ee-48...   1   5.2 1 average pepper 
1 2476378b-79ee-48...   1   5.2 1 average pepper 
2 2476378b-79ee-48...   1   5.2 1 average pepper 

[3 rows x 14 columns] 

dove l è la vostra lista (analizzato JSON)

+1

@simongraham, sono contento di aver potrebbe aiutare. :) Si prega di considerare [accettare] (http://meta.stackexchange.com/a/5235) la risposta più utile - questo indicherà anche che la tua domanda ha avuto risposta. – MaxU

+0

Non credo che tu possa darmi una mano con la mia ultima modifica del problema attuale. Grazie :) – simongraham

+0

@simongraham, penso che dovresti passare qualcosa come 'data ['nutritionPortions']' invece di 'data' a' json_normalize' – MaxU