You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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')

代码问题解析

你的代码存在三个核心问题:

  1. 变量名拼写错误:解析后的JSON赋值给了js_str,但json_normalize里误用了未定义的js_df,直接会触发NameError。
  2. json_normalize参数误用:['report Accessible']是每个Report Details对象内部的数组字段,不能放在第三个参数(用于提取顶层父字段)中,这个参数仅适用于提取像TileName这类顶层字段。
  3. 字段命名不统一:原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:40:28