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

将非结构化JSON转换为结构化DataFrame:足球数据处理问题

问题:将嵌套映射结构的JSON转换为CSV式结构化DataFrame

尝试读取GitHub上包含足球队、赛事和球员信息的JSON文件,使用以下代码:

import json
import pandas as pd
import urllib.request
from pandas import json_normalize

load_path = 'https://raw.githubusercontent.com/henriquepgomide/caRtola/master/data/2021/Mercado_10.txt'
games_2021 = json.loads(urllib.request.urlopen(load_path).read().decode('latin-1'))
games_2021 = json_normalize(games_2021)
games_2021

但处理后的输出不符合预期,期望得到与读取2022年CSV文件一致的规整结构化格式:

pd.read_csv('https://raw.githubusercontent.com/henriquepgomide/caRtola/master/data/2022/rodada-0.csv')

两个数据源信息一致,区别在于JSON采用带字段映射的字典结构,而CSV已为扁平化的规整格式,需完成转换。


解决方案

核心思路

JSON文件的顶层包含atletas(球员列表)和clubes、posicoes、status等映射字典(用于将球员数据中的ID转换为实际名称)。直接规范化整个JSON会导致映射字典被错误展开,需先提取球员列表,再利用映射字典替换ID字段,最终得到和CSV一致的结构。

完整代码

import json
import pandas as pd
import urllib.request
from pandas import json_normalize

# 读取并解析JSON数据
load_path = 'https://raw.githubusercontent.com/henriquepgomide/caRtola/master/data/2021/Mercado_10.txt'
raw_data = json.loads(urllib.request.urlopen(load_path).read().decode('latin-1'))

# 提取球员列表与各类映射字典(ID转名称)
player_list = raw_data['atletas']
club_mapping = {club_id: club_info['nome'] for club_id, club_info in raw_data['clubes'].items()}
position_mapping = {pos_id: pos_info['nome'] for pos_id, pos_info in raw_data['posicoes'].items()}
status_mapping = {status_id: status_info['nome'] for status_id, status_info in raw_data['status'].items()}

# 规范化球员列表数据
players_df = json_normalize(player_list)

# 替换ID为对应名称
players_df['clube.nome'] = players_df['clube_id'].map(club_mapping)
players_df['posicao.nome'] = players_df['posicao_id'].map(position_mapping)
players_df['status.nome'] = players_df['status_id'].map(status_mapping)

# 调整列结构,匹配CSV格式(可根据需求增减字段)
final_df = players_df[['atleta_id', 'nome', 'apelido', 'clube.nome', 'posicao.nome', 'status.nome',
                       'pontos_num', 'preco_num', 'variacao_num', 'media_num']]

# 查看结果
print(final_df.head())

代码说明

  1. 提取核心数据:从JSON中单独取出atletas列表,这是和CSV对应的核心数据部分;
  2. 构建映射字典:将clubes等字段的ID与名称对应,用于后续替换;
  3. 规范化球员数据:用json_normalize处理球员列表,得到扁平化的基础DataFrame;
  4. 替换映射字段:将球员数据中的ID字段(如clube_id)替换为实际名称;
  5. 调整列结构:根据CSV的列名筛选并排列字段,得到与目标格式一致的结果。

内容的提问来源于stack exchange,提问作者Vinícius Felizatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:09:31