如何在Python中将嵌套JSON完全展开为DataFrame
完全展开嵌套JSON为DataFrame的解决方案
针对你提供的嵌套JSON结构,直接使用json_normalize只能得到单行数据,无法完全展开列表和嵌套对象。以下是分步拆解并合并为完整表格的实现方案:
步骤1:加载JSON数据并提取核心部分
首先读取JSON文件,提取data字段作为处理核心:
import json import pandas as pd # 加载JSON数据(假设文件名为report.json) with open('report.json', 'r', encoding='utf-8') as f: raw_data = json.load(f) data = raw_data['data']
步骤2:拆解各嵌套模块
2.1 展开货币列表(currencies)
这部分是多行数据,直接用json_normalize展开:
df_currencies = pd.json_normalize(data['currencies'])
2.2 拆分日期区间(periods)
将嵌套的日期列表拆分为开始/结束日期:
period_start, period_end = data['periods'][0] date_data = pd.DataFrame({ 'start_date': [period_start], 'end_date': [period_end] })
2.3 展开指标数值(points、totals)
处理points和totals中的嵌套列表与对象,提取具体数值:
# 处理points中的measures df_points = pd.json_normalize(data['points']) df_points = df_points.explode('measures')\ .apply(lambda x: x['measures'] if isinstance(x['measures'], dict) else x, axis=1)\ .apply(pd.Series)\ .add_suffix('_point') # 处理totals中的数值 df_totals = pd.json_normalize(data['totals']['2'])\ .apply(pd.Series)\ .add_suffix('_total')
2.4 整理基础报表信息
提取报表标题、分页状态等基础字段:
base_info = pd.DataFrame({ 'report_title': [data['report_title']], 'is_last_page': [data['is_last_page']], 'total_rows': [data['total_rows']] })
步骤3:合并所有数据
将上述各模块合并,由于报表只有1行核心数据,与货币列表做交叉合并,得到每个货币对应的完整报表行:
# 合并基础信息、日期、指标数值 core_data = base_info.merge(date_data, left_index=True, right_index=True)\ .merge(df_points, left_index=True, right_index=True)\ .merge(df_totals, left_index=True, right_index=True) # 交叉合并货币列表与核心数据 final_df = df_currencies.merge(core_data, how='cross')
最终效果
生成的final_df会将所有嵌套结构完全展开,每个货币对应一行数据,包含所有指标、日期、报表信息,无任何嵌套单元格。
内容的提问来源于stack exchange,提问作者EvgeniyKarasev
相关产品推荐
相关产品推荐

