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

如何从嵌套字典列表生成指定格式的Pandas DataFrame?

从嵌套字典列表生成指定格式的Pandas DataFrame

问题背景

我是Pandas新手,尝试从嵌套字典列表创建Pandas DataFrame时遇到格式问题,暂未找到合适解决方案。

嵌套字典列表数据

"iam": {
    "data": [
      {
        "Account": "123",
        "Alias": "aws-alias-123",
        "Roles": [
          {
            "Role": "ADFS-111"
          },
          {
            "Role": "ADFS-222"
          },
          {
            "Role": "ADFS-333"
          }
        ],
        "Users": []
      },
      {
        "Account": "456",
        "Alias": "aws-alias-456",
        "Roles": [
          {
            "Role": "ADFS-444"
          },
          {
            "Role": "ADFS-555"
          },
          {
            "Role": "ADFS-666"
          }
        ],
        "Users": []
      },
      {
        "Account": "789",
        "Alias": "aws-alias-789",
        "Roles": [
          {
            "Role": "ADFS-777"
          },
          {
            "Role": "ADFS-888"
          },
          {
            "Role": "ADFS-999"
          }
        ],
        "Users": []
      }
    ]
  }

当前使用代码

roles = pd.DataFrame(event['iam']['data']).explode('Roles', ignore_index=True).reindex(columns=['Account','Roles'])

当前输出

Account       Roles
0   123   {'Role': 'ADFS-111'}
1   123   {'Role': 'ADFS-222'}
2   123   {'Role': 'ADFS-333'}
3   456   {'Role': 'ADFS-444'}
4   456   {'Role': 'ADFS-555'}
5   456   {'Role': 'ADFS-666'}
6   789   {'Role': 'ADFS-777'}
7   789   {'Role': 'ADFS-888'}
8   789   {'Role': 'ADFS-999'}

期望输出

Account   Roles
123       ADFS-111
          ADFS-222
          ADFS-333
456       ADFS-444
          ADFS-555
          ADFS-666
789       ADFS-777
          ADFS-888
          ADFS-999

解决方案

分两步处理:提取Role字段值,隐藏Account列的重复值。

完整代码

import pandas as pd

# 生成DataFrame并展开Roles列
roles_df = pd.DataFrame(event['iam']['data']).explode('Roles', ignore_index=True)

# 从嵌套字典中提取Role字段的值
roles_df['Roles'] = roles_df['Roles'].str['Role']

# 保留需要的列
roles_df = roles_df[['Account', 'Roles']]

# 将Account列重复值替换为空字符串
roles_df['Account'] = roles_df['Account'].mask(roles_df['Account'].duplicated(), '')

# 打印无索引的结果
print(roles_df.to_string(index=False))

代码说明

  1. 展开Roles列:用explode将每个Role字典拆分为单独行,这一步你已经完成。
  2. 提取Role值:通过str['Role']直接从字典中取出Role字段内容,替换原有的字典格式。
  3. 处理重复Account:用mask结合duplicated()方法,把Account列重复出现的值替换为空,实现同一Account仅显示一次的效果。
  4. 无索引输出:用to_string(index=False)打印时去掉默认索引,匹配期望格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:46