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

将多层嵌套对象展平为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)

关键说明

  1. 自动处理嵌套层级:pd.json_normalize()会递归展开所有嵌套的字典,包括additionalData、condition这类深层结构,生成如item1_relatedItems_2_additionalData_createdBy的列名。
  2. 列表字段的单行处理:对于relatedItems这类列表类型的字段,工具会自动为列表中的每个元素添加索引后缀(_0、_1、_2),将列表内的每个对象展开为独立列,同时保持单行结构。
  3. 多行数据适配:如果你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:41:06