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
相关产品推荐
相关产品推荐

