如何将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"]]
运行后输出结果完全符合你的预期:
| A | B | ID.ii | ID.jj | Finish |
|---|---|---|---|---|
| a | b | ABC | BCD | yes |
| a | b | AAC | FFD | yes |
方案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
相关产品推荐
相关产品推荐

