如何将API返回的JSON字典转为含name/value列的Pandas DataFrame
问题与解决方案
问题背景
从API获取的原始JSON数据如下:
{ "code": "200000", "data": { "A": "0.43221600", "B": "0.02311155", "C": "0.55057515", "D": "2.15957924", "E": "0.03818908", "F": "0.26853420", "G": "0.15007500", "H": "0.00685843", "I": "0.08500848" } }
使用pd.json_normalize()处理后得到宽格式DataFrame:
import pandas as pd import json f = open('file.json', 'r') j1 = json.load(f) df_normalized = pd.json_normalize(j1) print(df_normalized)
输出:
code data.A data.B data.C data.D data.E data.F data.G data.H data.I 0 200000 0.43221600 0.02311155 0.55057515 2.15957924 0.03818908 0.26853420 0.15007500 0.00685843 0.08500848
需要将data字段转换为包含name和value两列的长格式DataFrame。
实现方法
方法1:直接提取data字段构造(最简洁)
跳过json_normalize,直接从加载的JSON中提取data字典,转换为目标结构:
import pandas as pd import json f = open('file.json', 'r') j1 = json.load(f) # 将data字典转为(index, value),再重置索引并重命名列 df = pd.DataFrame.from_dict(j1['data'], orient='index').reset_index() df.columns = ['name', 'value'] print(df)
方法2:从已归一化的宽表转换
如果已经有了归一化后的DataFrame,使用melt()将宽表转长表:
# 基于已有的df_normalized df_melted = df_normalized.melt( id_vars=['code'], # 保留code列(可选,不需要可移除) value_vars=[col for col in df_normalized.columns if col.startswith('data.')], var_name='name', value_name='value' ) # 去除name列的"data."前缀 df_melted['name'] = df_melted['name'].str.replace('data.', '') # 移除code列并重置索引 df_melted = df_melted.drop('code', axis=1).reset_index(drop=True) print(df_melted)
方法3:在json_normalize阶段指定参数
利用json_normalize的record_path参数直接解析data字段:
df = pd.json_normalize( j1, record_path=['data'], # 指定要展开的嵌套字段 meta=['code'], # 保留外层的code字段(可选) errors='ignore' ) # 调整列名和结构 df = df.reset_index().rename(columns={'index':'name', 0:'value'}).drop('code', axis=1) print(df)
最终输出
三种方法均会得到目标结构的DataFrame:
name value 0 A 0.43221600 1 B 0.02311155 2 C 0.55057515 3 D 2.15957924 4 E 0.03818908 5 F 0.26853420 6 G 0.15007500 7 H 0.00685843 8 I 0.08500848
内容的提问来源于stack exchange,提问作者josoko
相关产品推荐
相关产品推荐

