如何访问深层嵌套JSON并转换为含多阶段DPS的Pandas DataFrame?
嵌套JSON转目标Pandas DataFrame解决方案
核心思路
分三步处理:提取各阶段DPS数据→合并多阶段数据→(可选)补充嵌套伤害数据,最终得到包含group、name、acc及三阶段DPS的DataFrame。
1. 提取各阶段DPS数据
直接从指定路径提取前10名玩家的DPS数据,转为单独的DataFrame:
import pandas as pd # 提取三个阶段的前10名DPS数据 phase1_df = pd.DataFrame(data['phases'][1]['dpsStats'][0:10]) phase2_df = pd.DataFrame(data['phases'][6]['dpsStats'][0:10]) phase3_df = pd.DataFrame(data['phases'][12]['dpsStats'][0:10])
2. 合并多阶段数据
以玩家唯一标识acc为键,合并三个阶段的DPS数据,保留需要的字段:
# 初始化主DataFrame,保留阶段1的基础信息和DPS merged_df = phase1_df[['group', 'name', 'acc', 'dps']].rename(columns={'dps': 'phase1_dps'}) # 合并阶段2和阶段3的DPS数据,用outer join保证所有玩家都被保留 merged_df = merged_df.merge( phase2_df[['acc', 'dps']].rename(columns={'dps': 'phase2_dps'}), on='acc', how='outer' ) merged_df = merged_df.merge( phase3_df[['acc', 'dps']].rename(columns={'dps': 'phase3_dps'}), on='acc', how='outer' ) # 可选:将缺失的DPS值填充为0 merged_df.fillna(0, inplace=True)
3. 补充嵌套的伤害数据(可选)
如果需要从details.dmgDistributions提取伤害数据,用json_normalize展开嵌套结构后合并:
from pandas import json_normalize # 展开玩家的details.dmgDistributions字段,保留基础信息 player_damage = json_normalize( data['players'], record_path=['details', 'dmgDistributions'], meta=['group', 'acc', 'name'] ) # 合并到主DataFrame final_df = merged_df.merge( player_damage[['acc', 'contributedDamage', 'totalDamage']], on='acc', how='left' )
最终结果
处理后的DataFrame包含字段:
group:玩家分组name:玩家名称acc:玩家账号(唯一标识)phase1_dps:阶段1 DPSphase2_dps:阶段2 DPSphase3_dps:阶段3 DPScontributedDamage(可选):玩家贡献伤害totalDamage(可选):对应阶段总伤害
内容的提问来源于stack exchange,提问作者Icharo-tb
相关产品推荐
相关产品推荐

