[英]viewing nested JSON data into a pandas dataframe
我現在已將當前問題添加到GitHib中。 請找到repo的URL。 我已經加入了一個Jupyter筆記本,也解釋了這個問題。 多謝你們。
https://github.com/simongraham/dataExplore.git
我目前正在處理項目的營養數據,其中數據采用原始JSON格式,我想使用python和pandas來獲得可理解的數據框架。 我知道當JSON沒有嵌套時,這是一項簡單的任務。 在這里我會用:
nutrition = pd.read_json('data')
但是我有嵌套信息,我發現很難將它放入合理的數據框架中。 JSON格式如下,其中nutrition營養元素本身是嵌套元素。 這個元素的巢將描述各種不同的東西的營養成分,如酒精和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”嵌套。 讓我們假設所有其他列都沒有嵌套,它們由“Activity”和“Wellbeing”表示。
如果我使用代碼:
nutrition = (pd.io
.json
.json_normalize(data, ['nutritionPortions'])
)
我將回到原來的問題,其中“營養營養素”是嵌套的,但我沒有成功,然后獲得相應的數據框。
謝謝
更新:這應該適用於您的kaidoData.json
文件:
df = (pd.io
.json
.json_normalize(data[0]['ionPortions'], 'nutritionNutrients',
['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize',
'dtCreatedDate','dtUpdatedDate','nProcessingStatus',
'vcPortionUnit','dtConsumedDate'
]
)
)
PS我不知道'ftEnergyKcal'有什么問題 - 它讓我失望:
KeyError:'ftEnergyKcal'
也許它在某些部分缺失了
老答案:
使用json_normalize() :
(pd.io
.json
.json_normalize(l, 'nutritionNutrients',
['vcNutritionId','vcUserId','vcPortionId','vcPortionName','vcPortionSize',
'ftEnergyKcal','vcPortionUnit','dtConsumedDate'])
)
演示:
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]
其中l
是你的列表(解析JSON)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.