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

如何将嵌套字典数据拆解为MultiIndex Pandas DataFrame

实现多级索引DataFrame的步骤

直接用json_normalize先扁平化数据,再把列名重构为多级索引即可,具体操作如下:

1. 导入依赖并加载数据

import pandas as pd

datalist = [
    {
        'trial': 'efr1',
        'location': 'aberdeen',
        '2010': {'yield': '100', 'quality': '97'},
        '2011': {'yield': '90', 'quality': '87'},
        '2012': {'yield': '88', 'quality': '90'}
    },
    {
        'trial': 'efr2',
        'location': 'bristol',
        '2010': {'yield': '88', 'quality': '90'},
        '2011': {'yield': '75', 'quality': '82'},
        '2012': {'yield': '77', 'quality': '80'}
    },
    {
        'trial': 'axy1',
        'location': 'newcastle',
        '2010': {'yield': '91', 'quality': '95'},
        '2011': {'yield': '93', 'quality': '93'},
        '2012': {'yield': '75', 'quality': '97'}
    }   
]

2. 扁平化嵌套数据

用pd.json_normalize把嵌套字典展开为带复合名称的扁平列:

df_flat = pd.json_normalize(datalist)

此时列名格式为trial、location、2010.yield、2010.quality。

3. 重构为多级索引结构

把复合列名拆分为「年份-指标」的多级结构,同时将trial和location设为行索引:

# 拆分列名生成多级索引
df_flat.columns = pd.MultiIndex.from_tuples(
    [col.split('.') if '.' in col else (col, '') for col in df_flat.columns],
    names=['Year', 'Metric']
)

# 调整行索引并清理冗余层级
df_multi = df_flat.set_index([('trial', ''), ('location', '')])
df_multi.columns = df_multi.columns.droplevel(1)  # 移除空的指标层级
df_multi.index.names = ['trial', 'location']  # 重命名行索引

4. 转换数值类型(可选)

原数据中的yield和quality为字符串格式,转成数值类型便于后续分析:

df_multi = df_multi.apply(pd.to_numeric)

最终得到的DataFrame完全符合需求:年份作为一级列,每个年份下包含yield和quality子列,行维度为trial与location的组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:18:29