Python使用Pandas解析嵌套JSON并写入Excel时的嵌套字段提取报错解决方案咨询
解决pandas json_normalize处理嵌套数组字段的KeyError问题
我来帮你搞定这个嵌套字段提取的问题!你遇到的KeyError是因为scopeRoles是一个数组类型的字段,pd.json_normalize默认不会自动展开数组里的嵌套对象属性,所以直接用scopeRoles.name是找不到对应的列的。下面给你两种可行的解决方案:
方案1:展开嵌套数组生成多行数据
如果你的scopeRoles里可能有多个条目,想把每个条目单独作为一行,同时保留顶层的用户信息,可以在json_normalize时指定record_path和meta参数:
import pandas as pd # 你的原始JSON数据 result = { "apiToken": {"createdAt": "2022-03-04T12:18:29.000956Z", "expiresAt": "2022-09-04T12:18:29.000956Z"}, "canGenerateApiToken": True, "dateJoined": "2021-01-29T10:07:04.395172Z", "email": "john@doe.com", "emailReadOnly": True, "emailVerified": True, "firstLogin": "2021-01-29T13:01:33.294216Z", "fullName": "John Doe", "fullNameReadOnly": True, "groupsReadOnly": False, "id": "32168415841", "isSystem": False, "lastLogin": "2022-09-12T08:51:00.159750Z", "lowestRole": "Admin", "primaryTwoFaMethod": "application", "scope": "account", "scopeRoles": [{"id": "68418945648943589", "name": "AT || ACME Inc.", "roleId": "9848949354653168", "roleName": "Admin", "roles": ["Admin"]}], "siteRoles": [], "source": "sso_saml", "tenantRoles": [], "twoFaEnabled": True } # 展开scopeRoles数组,同时保留顶层的用户字段 df = pd.json_normalize( data=result, record_path="scopeRoles", # 指定要展开的数组字段 meta=["scope", "fullName", "email", "lowestRole"] # 需要保留的顶层字段 ) # 现在可以直接选择name列写入Excel df[["scope", "fullName", "email", "lowestRole", "name"]].to_excel(completename, index=False)
这种方式会把每个scopeRoles条目作为一行,适合一个用户有多个角色组的场景。
方案2:合并数组中的name到单个单元格
如果希望每个用户只占一行,把所有scopeRoles的name合并成一个字符串(比如用逗号分隔),可以先正常归一化,再用apply处理数组字段:
import pandas as pd df = pd.json_normalize(result) # 提取scopeRoles中的name,合并为单个字符串 df["scopeRoles_name"] = df["scopeRoles"].apply( lambda roles: ", ".join([role["name"] for role in roles]) if roles else "" ) # 选择需要的列写入Excel df[["scope", "fullName", "email", "lowestRole", "scopeRoles_name"]].to_excel(completename, index=False)
这种方式适合你只需要展示用户关联的所有角色组名称,不需要展开成多行的场景。
为什么原来的代码会报错?
pd.json_normalize默认只会处理顶层的非数组字段,对于数组类型的字段(比如scopeRoles),它会直接保留为列表对象,不会自动展开成scopeRoles.name这样的列名,所以你直接访问这个列名就会触发KeyError。
内容的提问来源于stack exchange,提问作者f0rd42
相关产品推荐
相关产品推荐

