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

如何将Python中含嵌套字典数组的字典转换为扁平化pandas DataFrame

嵌套字典展平为标准DataFrame的实现方法

原代码的问题根源

你之前用pd.DataFrame.from_dict(data, orient='index')生成的结果没有展开嵌套结构,核心原因是这个方法的逻辑是把顶级字典的键作为行索引,对应的值作为单列的单元格内容,不会递归识别列表、字典这类嵌套结构,自然会把ID字段的字典列表整体塞进单个单元格里。

具体实现方案

方案1:使用pandas内置json_normalize快速适配

这是pandas专门为处理嵌套字典、JSON结构提供的工具,刚好匹配你的场景,可直接运行:

import pandas as pd

data = {"A":"a","B":"b","ID":[{"ii":"ABC","jj":"BCD"},{"ii":"AAC","jj":"FFD"}],"Finish":"yes"}

res = pd.json_normalize(
    data,
    record_path="ID",  # 指定需要拆分为多行的嵌套列表字段
    meta=["A", "B", "Finish"]  # 指定需要和拆分后的行自动对齐填充的顶级字段
)
# 为嵌套字段的列加上ID前缀,匹配你期望的列名格式
res.columns = [f"ID.{col}" if col in ["ii", "jj"] else col for col in res.columns]

# 如果需要严格匹配示例的列顺序,可手动调整列位
res = res[["A", "B", "ID.ii", "ID.jj", "Finish"]]

运行后输出结果完全符合你的预期:

ABID.iiID.jjFinish
abABCBCDyes
abAACFFDyes

方案2:通用展开逻辑(适配更复杂的多层嵌套场景)

如果后续遇到嵌套层级更多、不方便提前指定record_path的情况,可以用「炸开列表+字典列展开」的通用逻辑实现,可复用性更强:

import pandas as pd

data = {"A":"a","B":"b","ID":[{"ii":"ABC","jj":"BCD"},{"ii":"AAC","jj":"FFD"}],"Finish":"yes"}
# 第一步:提取所有非嵌套的顶级字段,生成基础DataFrame
base_fields = ["A", "B", "Finish"]
res = pd.DataFrame({k: [data[k]] for k in base_fields})
# 第二步:把存储列表的ID列炸开,拆成独立的多行
res = res.explode("ID", ignore_index=True)
# 第三步:把炸开后每行存储的字典结构展开为独立列,自动加ID前缀
expanded_id_col = pd.json_normalize(res["ID"]).add_prefix("ID.")
# 第四步:将展开的列和基础表拼接,去掉原来的嵌套ID列
res = pd.concat([res.drop(columns="ID"), expanded_id_col], axis=1)
# 同样可按需调整列顺序
res = res[["A", "B", "ID.ii", "ID.jj", "Finish"]]

注意事项

  • 如果遇到嵌套字段内部键名重复的情况,json_normalize会自动按照嵌套层级拼接列名,不需要手动写前缀逻辑。
  • 你之前提到的实际输出里ID内部键名出现aa、bb的笔误问题,只需要在调整列名的时候对应替换即可,不影响整体展开逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 22:06:08