嵌套JSON使用pd.json_normalize转Pandas DataFrame结果异常问题求助
问题原因
你使用的JSON文件为两层嵌套字典结构:
- 顶层键为葡萄牙大区名称(如示例中的
Aveiro) - 每个大区对应的值为以市镇名称为键的嵌套字典
- 每个市镇下包含候选人列表
candidates、市镇基础信息、投票汇总字段total_votes
直接对顶层字典执行json_normalize会把所有嵌套路径展开为列,因此得到1行数千列的宽表。
解决方案代码
以下代码会将数据转换为每个候选人对应1行的标准分析用长表,自动保留所属大区、市镇信息、投票汇总数据,同时适配葡萄牙语特殊字符:
import pandas as pd from pandas import json_normalize import json # 读取原始JSON with open('autarquicas_2021.json', encoding='utf-8') as f: data = json.load(f) # 展开嵌套结构为行列表 rows = [] for district_name, district_data in data.items(): for municipality_name, municipality_data in district_data.items(): # 提取当前市镇的公共字段(所有候选人共享的信息) common_info = { "district": district_name, "municipality": municipality_name, "territoryKey": municipality_data.get("territoryKey"), **municipality_data.get("total_votes", {}) } # 遍历当前市镇的所有候选人,合并公共字段和候选人信息 for candidate in municipality_data.get("candidates", []): row = {**common_info, **candidate} rows.append(row) # 规范化生成DataFrame df = json_normalize(rows)
效果说明
生成的DataFrame默认包含几十列常用字段,可直接用于后续分析:
- 维度字段:大区、市镇、政党
party、候选人名单effectiveCandidates - 候选人得票字段:
votes.votes(得票数)、votes.percentage(得票率)、votes.mandates(获得席位)等 - 市镇汇总字段:
numberVoters(登记选民数)、percentageVoters(投票率)、blankVotes(空白票数)等
如果你需要每个市镇对应1行的汇总表,只需要去掉遍历候选人的逻辑,将市镇公共信息直接加入rows即可。
内容的提问来源于stack exchange,提问作者Jorge Gomes
相关产品推荐
相关产品推荐

