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

Python 不等长嵌套字典创建Pandas DataFrame问题求解

解决方案

你遇到的报错和错位问题本质是两个原因:一是不同学生的科目数量不一致,转DataFrame前没有做等长对齐;二是之前的实现没有严格绑定字段和值的映射关系,靠列表顺序拼数据很容易错位。
直接按下面的逻辑实现即可,兼容任意数量的科目,不会出现长度报错和字段错位:

import pandas as pd
import numpy as np

# 替换为你的实际数据源
data = [
   {
      "Info":{
         "StudentID":1000009,
         "firstName":"Name",
         "middleName":"Middle",
         "lastName":"Last"
      },
      "Pass":[
         {"Subject":"Math", "Score":98},
         {"Subject":"Science", "Score":100}
      ]
   },
   {
      "Info":{
         "StudentID":1000010,
         "firstName":"Name",
         "middleName":"Middle",
         "lastName":"Last"
      },
      "Pass":[
         {"Subject":"Math", "Score":90},
         {"Subject":"Science", "Score":82},
         {"Subject":"English", "Score":99}
      ]
   }
]

# 先统计所有学生中的最大科目数,作为列数基准
max_sub_count = max(len(stu["Pass"]) for stu in data)
result_rows = []

for stu in data:
    # 按固定字段名提取基础信息,从根源避免错位
    row = {
        "ID": stu["Info"]["StudentID"],
        "firstName": stu["Info"]["firstName"],
        "middleName": stu["Info"]["middleName"],
        "lastName": stu["Info"]["lastName"]
    }
    # 提取当前学生的所有科目
    current_subs = [p["Subject"] for p in stu["Pass"]]
    # 不足最大科目数的位置填充NaN,保证所有行长度一致
    current_subs += [np.nan] * (max_sub_count - len(current_subs))
    # 按序号映射到SubjectN列
    for i, sub in enumerate(current_subs, 1):
        row[f"Subject{i}"] = sub
    result_rows.append(row)

df = pd.DataFrame(result_rows)

运行后输出的结果和你的预期完全一致:

ID firstName middleName lastName Subject1 Subject2 Subject3
0  1000009      Name     Middle     Last     Math  Science      NaN
1  1000010      Name     Middle     Last     Math  Science  English

之前代码的问题说明

  • 存在多处低级笔误:比如把原始数据的键StudentID错写为individualId,middleName键多写了尾部空格,赋值exam变量后却调用未定义的subject变量,这些都会直接触发运行错误。
  • 第一种defaultdict累加的方案,没有按学生维度对齐科目列,每个SubjectN列只存储了有第N门课的学生数据,列长度自然不相等,也无法和学生ID绑定。
  • 第二种列表逐行拼接的方案,没有固定列和值的映射关系,一旦某条学生数据缺失某个基础字段,后面的科目值就会向前补位,造成全局字段错位,同时也没有做长度补全。

如果需要同时保留分数信息,逻辑完全一致:提取科目时同步提取分数,按相同规则补全缺失值,生成Score1/Score2/.../ScoreN列即可,不需要调整整体框架。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:54:34