如何用pd.json_normalize将嵌套JSON字符串转为目标格式DataFrame?
嵌套JSON转指定格式DataFrame问题分析
原始JSON数据
{"TileName": "Master", "Report Details": [ { "r1name": "Primary", "r1link": "link1", "report Accessible": ["operations", "Sales"] }, { "r2name": "Secondry", "r2link": "link2", "report Accessible": ["operations", "Sales"] } ] }
期望的DataFrame格式
TileName ReportAccssible ReportName ReportLink Master operations Primary link1 Master Sales Primary link1 Master operations Secondary link2 Master Sales Secondary link2
你的错误代码
js_str = json.loads(json_str) df = pd.json_normalize(js_df,'Report Details',['TileName',['report Accessible']], record_prefix='Col_',errors='ignore')
代码问题解析
你的代码存在三个核心问题:
- 变量名拼写错误:解析后的JSON赋值给了
js_str,但json_normalize里误用了未定义的js_df,直接会触发NameError。 json_normalize参数误用:['report Accessible']是每个Report Details对象内部的数组字段,不能放在第三个参数(用于提取顶层父字段)中,这个参数仅适用于提取像TileName这类顶层字段。- 字段命名不统一:原始JSON中两个报表分别用
r1name/r1link和r2name/r2link作为名称、链接字段,直接解析会生成4列,无法合并为你需要的ReportName和ReportLink。
正确实现代码
import json import pandas as pd # 原始JSON字符串 json_str='{"TileName": "Master", "Report Details": [ { "r1name": "Primary", "r1link": "link1", "report Accessible": ["operations", "Sales"] }, { "r2name": "Secondry", "r2link": "link2", "report Accessible": ["operations", "Sales"] } ] }' # 解析JSON数据 js_data = json.loads(json_str) # 提取Report Details转为DataFrame df_report = pd.DataFrame(js_data['Report Details']) # 统一报表名称和链接字段 df_report['ReportName'] = df_report['r1name'].fillna(df_report['r2name']) df_report['ReportLink'] = df_report['r1link'].fillna(df_report['r2link']) # 展开"report Accessible"数组,实现一行转多行 df_exploded = df_report.explode('report Accessible') # 添加顶层TileName字段,并重命名列名 final_df = df_exploded.assign(TileName=js_data['TileName']) final_df = final_df.rename(columns={'report Accessible': 'ReportAccssible'}) # 调整列顺序为期望格式 final_df = final_df[['TileName', 'ReportAccssible', 'ReportName', 'ReportLink']] print(final_df)
运行结果
TileName ReportAccssible ReportName ReportLink 0 Master operations Primary link1 0 Master Sales Primary link1 1 Master operations Secondry link2 1 Master Sales Secondry link2
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

