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

pandas规范化嵌套字典时如何保留外层键生成目标DataFrame

pandas嵌套字典转DataFrame展开列表列解决方案

问题原因

你原有代码只提取了字典的value部分传入json_normalize,完全丢弃了外层字典的键,因此最终结果缺失code列。另外你提供的示例字典存在语法错误:'name': ABC'缺少前引号,修正后字典结构为:

dictionary = {
    '101020': {'name': 'HJ', 'grades': [90, 80, 70]},
    '101520': {'name': 'ABC', 'grades': [100, 40, 70]}
}

可直接运行的实现代码

推荐不对原字典做修改的写法,避免污染原始数据:

import pandas as pd

# 构造记录时将外层字典键作为code字段合并到每条记录中
records = [{"code": code, **inner_info} for code, inner_info in dictionary.items()]
# 调用json_normalize,将code、name都作为元数据字段传入,展开grades列表
df = pd.json_normalize(
    records,
    record_path="grades",
    meta=["name", "code"]
).rename(columns={0: "grades"})[["code", "name", "grades"]]

print(df)

运行输出结果

执行后得到的DataFrame完全匹配你的预期结构:

code name  grades
0  101020   HJ      90
1  101020   HJ      80
2  101020   HJ      70
3  101520  ABC     100
4  101520  ABC      40
5  101520  ABC      70

写法说明

  • 列表推导式[{"code": code, **inner_info} for code, inner_info in dictionary.items()]会遍历字典的键值对,把外层键作为code字段和内层的name、grades字段合并成新的单条记录,不会修改原始字典内容
  • json_normalize的meta参数用来指定不需要展开、需要整行保留的字段,这里把name和code都传入即可保留两列内容
  • 因为grades展开后默认列名是0,最后通过rename改成目标列名grades,再调整列顺序就完成了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:12:17