如何从嵌套字典列表生成指定格式的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))
代码说明
- 展开Roles列:用
explode将每个Role字典拆分为单独行,这一步你已经完成。 - 提取Role值:通过
str['Role']直接从字典中取出Role字段内容,替换原有的字典格式。 - 处理重复Account:用
mask结合duplicated()方法,把Account列重复出现的值替换为空,实现同一Account仅显示一次的效果。 - 无索引输出:用
to_string(index=False)打印时去掉默认索引,匹配期望格式。
内容的提问来源于stack exchange,提问作者TheTemplateBlog
相关产品推荐
相关产品推荐

