如何用Pandas规范化嵌套JSON:展平嵌套字典与列表
解决JSON展平与父子记录关联的问题
你的问题出在分别对父数据独立拆分tests和testRuns后直接拼接,导致父记录没有随子记录复制,最终出现大量N/A。正确的做法是逐层关联合并:先将父记录与tests子记录绑定,再将绑定后的记录与testRuns子记录绑定,确保每一条子记录都能关联到完整的父记录。
最优实现代码
import pandas as pd # 提取核心结果数据 results = response['data']['getTestExecutions']['results'] # 1. 归一化父级数据,展开jira等嵌套字段,保留tests和testRuns的嵌套结果 df_parent = pd.json_normalize(results) # 2. 关联父记录与tests子记录 # 炸开tests.results,父记录自动复制对应条数 df_with_tests = df_parent.explode('tests.results', ignore_index=True) # 归一化tests子字段并添加前缀,合并到父记录 df_tests_norm = pd.json_normalize(df_with_tests['tests.results']).add_prefix('test.') df_with_tests = pd.concat([df_with_tests.drop('tests.results', axis=1), df_tests_norm], axis=1) # 3. 关联已绑定tests的记录与testRuns子记录 # 炸开testRuns.results,每条test记录自动复制对应testRuns条数 df_final = df_with_tests.explode('testRuns.results', ignore_index=True) # 归一化testRuns子字段并添加前缀,合并到最终表 df_testruns_norm = pd.json_normalize(df_final['testRuns.results']).add_prefix('testRuns.') df_final = pd.concat([df_final.drop('testRuns.results', axis=1), df_testruns_norm], axis=1) # 查看最终结果 print(df_final.columns) print(df_final)
代码说明
- 父级归一化:通过
pd.json_normalize直接展开父记录中的嵌套字段(如jira.key、jira.project.id等),同时保留tests.results和testRuns.results的嵌套结构用于后续拆分。 - 逐层炸开合并:
- 先炸开
tests.results,父记录会自动复制成与tests子记录数量一致的行,确保每条test都对应完整的父数据。 - 再炸开
testRuns.results,已绑定父+test的记录会再次复制,确保每条testRun都关联对应的父和test数据。
- 先炸开
- 字段前缀区分:通过
add_prefix给子字段添加前缀(test.、testRuns.),避免与父字段命名冲突。
效果验证
最终生成的df_final中,每一行都是父测试执行记录 + 单条test记录 + 单条testRun记录的完整组合,所有字段均无N/A值,且保留了原始JSON的所有键和层级顺序。
内容的提问来源于stack exchange,提问作者matzano
相关产品推荐
相关产品推荐

