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

Python中如何将嵌套字典转换为指定格式的DataFrame

如何将嵌套字典结构的scores转换为指定格式的Pandas DataFrame?

问题描述

给定如下嵌套字典结构的scores数据:

scores = [{"Student":"Adam","Subjects":[{"Name":"Math","Score":85},{"Name":"Science","Score":90}]},
     {"Student":"Bec","Subjects":[{"Name":"Math","Score":70},{"Name":"English","Score":100}]}]

直接使用pd.DataFrame(scores)转换会得到不符合预期的结果,希望将其转换为如下格式的DataFrame:

Student   Subject.Name   Subject.Score
 Adam         Math            85
 Adam         Science         90
 Bec          Math            70
 Bec          English         100

解决方案

方法一:使用pd.json_normalize(推荐)

这是处理嵌套字典结构最简洁的方式,通过指定参数展开嵌套列表并保留外层字段:

import pandas as pd

scores = [{"Student":"Adam","Subjects":[{"Name":"Math","Score":85},{"Name":"Science","Score":90}]},
     {"Student":"Bec","Subjects":[{"Name":"Math","Score":70},{"Name":"English","Score":100}]}]

# 直接通过json_normalize展开嵌套结构
df = pd.json_normalize(
    scores,
    record_path='Subjects',  # 指定要展开的嵌套列表字段
    meta='Student',          # 指定要保留的外层字段
    sep='.'                  # 指定嵌套字段的分隔符,匹配目标列名格式
)

# 调整列顺序与命名,完全匹配需求格式
df = df[['Student', 'Name', 'Score']].rename(columns={'Name': 'Subject.Name', 'Score': 'Subject.Score'})
print(df)

方法二:手动循环展开

如果需要更直观的逻辑展示,可以通过循环遍历构造数据列表,再转换为DataFrame:

import pandas as pd

scores = [{"Student":"Adam","Subjects":[{"Name":"Math","Score":85},{"Name":"Science","Score":90}]},
     {"Student":"Bec","Subjects":[{"Name":"Math","Score":70},{"Name":"English","Score":100}]}]

data_list = []
# 遍历每个学生及其科目,构造扁平化数据
for student_info in scores:
    student_name = student_info['Student']
    for subject in student_info['Subjects']:
        data_list.append({
            'Student': student_name,
            'Subject.Name': subject['Name'],
            'Subject.Score': subject['Score']
        })

df = pd.DataFrame(data_list)
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:45:57