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

嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:54:04