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

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

JSON转指定格式DataFrame的问题

输入JSON结构

{    
    "data": {        
        "success": true,        
        "timeseries": true,        
        "start_date": "2022-10-01",        
        "end_date": "2022-10-04",        
        "base": "EUR",        
        "rates": {            
            "2022-10-01": {                
                "NG": 0.1448939471560284            
            },            
            "2022-10-02": {                
                "NG": 0.14487923291390148            
            },            
            "2022-10-03": {                
                "NG": 0.1454857922753868            
            },            
            "2022-10-04": {                
                "NG": 0.1507352356663182            
            }        
        },        
        "unit": "per MMBtu"    
    }
}

期望的DataFrame格式

Date        NG        base 
2022-10-01  0.144894  EUR
2022-10-02  0.144879  EUR
2022-10-03  0.145486  EUR
2022-10-04  0.150735  EUR

尝试的代码及错误输出

尝试代码

import json
import pandas as pd

with open(r'C:\Users\EH\Desktop\tools\json_files\blue_file.json','r') as f:    
    data = json.loads(f.read())

df1 = pd.DataFrame(data['data']['rates'])
df1 = df1.T
df2 = pd.DataFrame(data['data'])
df2 = df2.base

merge = [df1, df2]
df3 = pd.concat(merge)

print(df3)

错误输出

NG    0
2022-10-01  0.144894  NaN
2022-10-02  0.144879  NaN
2022-10-03  0.145486  NaN
2022-10-04  0.150735  NaN
2022-10-01       NaN  EUR
2022-10-02       NaN  EUR
2022-10-03       NaN  EUR
2022-10-04       NaN  EUR

错误原因

你用pd.concat(merge)是按行方向拼接两个对象,导致原本的df1(含NG列)和df2(含base值的Series)被上下堆叠,两者没有共同列,所以交叉位置出现NaN。另外df2 = pd.DataFrame(data['data'])生成的DataFrame中,base列只有1个值,后续拼接时自动对齐索引重复填充,这种方式完全没必要——因为base是全局固定值,不需要单独生成DataFrame。

正确解决方案

直接处理rates生成基础DataFrame,然后添加固定值的base列,最后重置索引为Date列即可:

import json
import pandas as pd

with open(r'C:\Users\EH\Desktop\tools\json_files\blue_file.json','r') as f:    
    data = json.loads(f.read())

# 从rates生成DataFrame并转置,日期转为索引
df = pd.DataFrame(data['data']['rates']).T
# 添加base列,值为全局固定的EUR
df['base'] = data['data']['base']
# 重置索引,把日期转为显式列并命名为Date
df = df.reset_index().rename(columns={'index': 'Date'})
# 调整列顺序,匹配期望格式
df = df[['Date', 'NG', 'base']]
# 可选:保留NG列6位小数
df['NG'] = df['NG'].round(6)

print(df)

输出结果

Date        NG base
0  2022-10-01  0.144894  EUR
1  2022-10-02  0.144879  EUR
2  2022-10-03  0.145486  EUR
3  2022-10-04  0.150735  EUR

内容的提问来源于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.17 13:50:25