我有一个非常复杂/嵌套的JSON数据结构。
在阅读了SO上的其他解决方案后,我对我可能需要制作多个DF并将它们合并在一起(例如json_normalize with multiple record paths)这一事实感到放心。
{
"topLevelIdentifier": "a86507",
"activities": [
{
"activityId": "1f13d848",
"taskList": [
{
"taskIdentifier": "c6ba-1012",
"taskTime": {
"value": 0,
"unit": "SECONDS"
},
"taskLocationIdentifier": "3438"
},
{
"taskIdentifier": "cc48-07bf",
"taskTime": {
"value": 0,
"unit": "SECONDS"
},
"taskLocationIdentifier": "4b32"
},
{
"taskIdentifier": "35b896",
"taskTime": {
"value": 0,
"unit": "SECONDS"
},
"taskLocationIdentifier": "7bcca"
}
],
"sectionB": {
"someCapacityA": {
"totalVolume": {
"value": 8415,
"unit": "CU_CM"
},
"totalWeight": {
"value": 1059.0,
"unit": "GRAMS"
}
},
"someCapacityB": {
"totalVolume": {
"value": 0.0,
"unit": "CU_CM"
},
"totalWeight": {
"value": 0.0,
"unit": "GRAMS"
}
}
},
"sectionC": {....},
"sectionD": {....},
"sectonE":{...}
}]}
我可以通过以下操作创建合并的基础:
with open('my_file.json') as simulation_file:
simulation_data = json.load(simulation_file)
df_base = pd.json_normalize(simulation_data, 'activities',['topLevelIdentifier'])
那么归一化下一部分也不算太糟:
df_taskList = pd.json_normalize(simulation_data['activities'],
'taskList',['activityId'])
它正在规范化下一个部分,这让我卡住了。下面是我正在尝试的,但抛出了一个错误:
df_sectionB = pd.json_normalize(simulation_data['activities'],
'activityId',['taskList',['taskIdentifier',['taskTime',['unit', 'value']], 'taskLocationIdentifier']])
我基本上是尝试将sectionB
扁平化,使其具有activityId
,以便可以将所有部分合并在一起。
如果有一种更简单的方法可以将像这样复杂的格式展平到最深的层,我会考虑其他的方法!
2条答案
按热度按时间wz8daaqr1#
你可以试试flatten_json。我不得不从你的例子中删除C,D,E部分,所以不清楚这是否能如你所需的那样工作。参考文档以获得更多信息。
将字典设置为test_json
bnl4lu3b2#
您可以将
.explode("taskList")
添加到第一次规格化的结果中。然后,可以规范化
taskList
列,复制基索引,并将结果连接起来。