2016-06-23 9 views
5

私はGitHibに現在の問題を追加しました。レポのURLを見つけてください。私は問題を説明しているJupyterノートブックを添付しました。みんなありがとう。パンダのデータフレームにネストされたJSONデータを表示

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


私は現在、データは生のJSON形式であるプロジェクトのための栄養データで働いている、と私は理解しやすいデータフレームを取得するためのpythonとパンダを使用します。 JSONがネストされていない場合、これは簡単な作業であると私は理解しています。ここで私は使用します:

nutrition = pd.read_json('data') 

しかし、私はネストされた情報を持っていますが、それは合理的なデータフレームに取得することは非常に困難です。 JSON形式は、nutritionNutrients要素自体が入れ子要素である次のとおりです。この要素の巣はアルコールやbcfaなどのさまざまなものの栄養成分を記述します。これは大きなデータファイルであるため、サンプルを追加しただけです。

[ 
     { 
      "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": "" 
       }, 
       ... 
      ] 
     } 
    ] 

助けてください。

ありがとうございました。

.... ....

今私はjson_normalizeを使用してこの問題を解決する方法を発見したことを、私は同じ問題を返しますが、この時間は私のコードを二回ネストされています。すなわち:

[ 
{ 
... 
} 
[, 
"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": "" 
      }, 
      ... 
      } 
      ] 
     } 
     ] 

私は私が使用できる唯一の栄養データからなるJSONを持っている:

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

しかし、私のデータは栄養情報をだけでなく、含まれていません。たとえば、アクティビティ情報が含まれるため、栄養情報は最初に「nutrtitionPortions」でネストされます。他のすべての列がネストされておらず、それらが「アクティビティ」と「ウェルビーイング」で表されているとします。

私は、コードを使用する場合:

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

私は「nutritionNutrients」がネストされている元の問題に戻りますが、私は、対応するデータフレームを取得する何の成功を持っていないのです。

おかげ

答えて

4

UPDATE:これはあなたのkaidoData.jsonファイルのために働く必要があります:i 'はftEnergyKcal' と間違っているかわからない

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

PS - それは私がスローされます。

KeyError: 'ftEnergyKcal'

一部のセクションで不足している可能性があります。

OLD答え:

使用json_normalize()

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

デモ:

lはあなたのリストである
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] 

(JSONを解析された)

+1

@simongraham、私はうれしいI助けることができます。 :) [accepting](http://meta.stackexchange.com/a/5235)を最も参考になる回答と考えてください。これはあなたの質問に答えられたことを示します。 – MaxU

+0

現在の問題の最新の編集で私に手を差し伸べることはできません。ありがとう:) – simongraham

+0

@simongraham、私は 'data''の代わりに' data ['nutritionPortions'] 'のようなものを' json_normalize'に渡さなければならないと思います – MaxU

関連する問題