将多层嵌套对象展平为DataFrame:保留单行拆分列的方法
解决嵌套字典/列表的DataFrame扁平展开(保留单行)
针对你遇到的嵌套字段无法展开为单行多列的问题,推荐使用pandas的pd.json_normalize()工具,它能自动处理多层嵌套的字典和列表,且不会像explode那样拆分多行。以下是具体实现步骤:
完整代码示例
假设你的初始DataFrame包含一个Items列,值为你提供的嵌套字典:
import pandas as pd # 你的嵌套字典示例 obj = { "item1": { "id": "item1", "relatedItems": [ {"id": "1111", "category": "electronics"}, {"id": "9999", "category": "electronics", "subcategory": "computers"}, {"id": "2222", "category": "electronics", "subcategory": "computers", "additionalData": {"createdBy": "Doron", "inventory": 100}} ] }, "item2": { "id": "item2", "relatedItems": [ {"id": "4444", "category": "furniture", "subcategory": "sofas"}, {"id": "5555", "category": "books"}, {"id": "6666", "category": "electronics", "subcategory": "computers", "additionalData": {"createdBy": "Joe", "inventory": 5, "condition": {"name": "new", "inspectedBy": "Doron"}}} ] } } # 构造初始DataFrame(模拟你的数据结构) df = pd.DataFrame({"Items": [obj]}) # 核心步骤:用json_normalize展开所有嵌套结构,保留单行 # sep参数指定嵌套字段的分隔符,让列名更直观 final_df = pd.json_normalize(df['Items'].iloc[0], sep='_') # 查看结果 display(final_df)
关键说明
- 自动处理嵌套层级:
pd.json_normalize()会递归展开所有嵌套的字典,包括additionalData、condition这类深层结构,生成如item1_relatedItems_2_additionalData_createdBy的列名。 - 列表字段的单行处理:对于
relatedItems这类列表类型的字段,工具会自动为列表中的每个元素添加索引后缀(_0、_1、_2),将列表内的每个对象展开为独立列,同时保持单行结构。 - 多行数据适配:如果你的DataFrame有多行,每行都包含类似的嵌套字典,可以用循环批量处理:
# 假设df有多行数据 df = pd.DataFrame({"Items": [obj, obj]}) # 批量处理每行的嵌套结构 final_df = pd.concat([pd.json_normalize(row, sep='_') for row in df['Items']], ignore_index=True)
替代方案(分步展开)
如果你需要更精细的控制,可以分步展开外层字典和内层嵌套:
# 第一步:展开外层的item1、item2为独立列 df_expanded = df['Items'].apply(pd.Series) # 第二步:分别展开item1和item2的嵌套结构并添加前缀 item1_df = pd.json_normalize(df_expanded['item1'], sep='_').add_prefix('item1_') item2_df = pd.json_normalize(df_expanded['item2'], sep='_').add_prefix('item2_') # 合并所有列 final_df = pd.concat([item1_df, item2_df], axis=1)
内容的提问来源于stack exchange,提问作者Doron Barel
相关产品推荐
相关产品推荐

