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

如何从嵌套JSON文件创建指定格式的Pandas DataFrame?

从嵌套JSON生成指定格式的DataFrame

原始JSON数据

{
    "data": {
        "start_date": "2022-10-01",
        "end_date": "2022-10-04",
        "cur": "EUR",
        "prizes": {
            "2022-10-01": {
                "coffee": 0.1448939471560284,
                "usd": 1
            },
            "2022-10-02": {
                "coffee": 0.14487923291390148,
                "usd":1
            },
            "2022-10-03": {
                "coffee": 0.1454857922753868,
                "usd": 1
            }
        }
    }
}

期望生成的DataFrame

coffee  
2022-10-01  0.144894  
2022-10-02  0.144879  
2022-10-03  0.145486 

错误尝试代码及报错

错误代码

path = r'C:\Users\Geo\Desktop\json_files\coffee.json'

df = pd.read_json(path)
df = pd.DataFrame(df['data']['prizes']['2022-10-01']['coffee']).T
print(df)

报错信息

raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!

正确实现方法

方法一:直接解析嵌套结构构造DataFrame

读取JSON后提取prizes数据,转置后筛选目标列:

import pandas as pd

path = r'C:\Users\Geo\Desktop\json_files\coffee.json'
# 读取JSON为Series格式
data = pd.read_json(path, typ='series')
# 提取prizes字典转为DataFrame并转置,保留coffee列
df = pd.DataFrame(data['data']['prizes']).T[['coffee']]
# 保留6位小数
df = df.round(6)
print(df)

方法二:原生json模块配合字典推导

先解析JSON,提取目标数据构造字典后转DataFrame:

import pandas as pd
import json

path = r'C:\Users\Geo\Desktop\json_files\coffee.json'
with open(path, 'r') as f:
    json_data = json.load(f)
# 提取每个日期对应的coffee值
coffee_data = {date: info['coffee'] for date, info in json_data['data']['prizes'].items()}
# 从字典生成DataFrame,设置索引为日期
df = pd.DataFrame.from_dict(coffee_data, orient='index', columns=['coffee'])
df = df.round(6)
print(df)

方法三:利用pd.json_normalize简化解析

通过归一化工具处理嵌套JSON:

import pandas as pd
import json

path = r'C:\Users\Geo\Desktop\json_files\coffee.json'
with open(path, 'r') as f:
    json_data = json.load(f)
# 归一化嵌套的prizes数据并转置
df = pd.json_normalize(json_data['data']['prizes']).T
# 设置列名并移除索引名称
df.columns = ['coffee']
df.index.name = None
df = df.round(6)
print(df)

内容的提问来源于stack exchange,提问作者Erling_Haaland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:55:21