将非结构化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())
代码说明
- 提取核心数据:从JSON中单独取出
atletas列表,这是和CSV对应的核心数据部分; - 构建映射字典:将
clubes等字段的ID与名称对应,用于后续替换; - 规范化球员数据:用
json_normalize处理球员列表,得到扁平化的基础DataFrame; - 替换映射字段:将球员数据中的ID字段(如
clube_id)替换为实际名称; - 调整列结构:根据CSV的列名筛选并排列字段,得到与目标格式一致的结果。
内容的提问来源于stack exchange,提问作者Vinícius Felizatti
相关产品推荐
相关产品推荐

