如何从双层嵌套字典创建Pandas多级索引DataFrame?
从双层嵌套字典创建Pandas多级索引DataFrame
解决方案代码
针对你提供的嵌套字典结构,可通过以下步骤生成目标多级索引DataFrame:
import pandas as pd # 你的原始嵌套字典数据 data = { 'ID':{ 0:{ 'date ↕':'2024-05-23', 'Fighter Weight':'', 'Opponent':'fighter_1', 'Opponent Weight':'', 'w-l-d':('11', '0', '0'), 'result':'VS', 'rounds':'12' }, 1:{ 'date ↕':'2022-08-28', 'Fighter Weight':'227¾', 'Opponent':'Fighter_2', 'Opponent Weight':'211', 'result':'W-SD', 'rounds':'12/12' } } } # 转换为目标结构 final_df = pd.DataFrame() for fighter_id, fight_details in data.items(): # 将单场比赛的详情转为行,比赛编号作为上层索引 fight_series = pd.DataFrame.from_dict(fight_details, orient='index').stack() # 将Series转为DataFrame列,列名为拳手ID final_df[fighter_id] = fight_series # 重置索引名称(可选,让索引更清晰) final_df.index.names = ['比赛编号', '比赛详情']
执行后得到的final_df结构与你期望的完全一致:
ID 比赛编号 比赛详情 0 date ↕ 2024-05-23 Fighter Weight Opponent fighter_1 Opponent Weight w-l-d (11, 0, 0) result VS rounds 12 1 date ↕ 2022-08-28 Fighter Weight 227¾ Opponent Fighter_2 Opponent Weight 211 w-l-d result W-SD rounds 12/12
为什么最初的DataFrame.from_dict(data)不生效
默认情况下from_dict的orient参数为'columns',会把外层字典的键(如ID)作为列名,内层字典直接作为单元格值,无法解析嵌套层级,因此需要通过orient='index'先将比赛编号转为行,再用stack()将详情字段拆分为二级索引。
爬虫数据存储格式建议
如果可以修改爬虫程序,建议将数据存储为列表嵌套字典的扁平化格式,每个元素代表一场完整比赛,示例如下:
[ { "fighter_id": "ID", "fight_number": 0, "date ↕": "2024-05-23", "Fighter Weight": "", "Opponent": "fighter_1", "Opponent Weight": "", "w-l-d": ("11", "0", "0"), "result": "VS", "rounds": "12" }, { "fighter_id": "ID", "fight_number": 1, "date ↕": "2022-08-28", "Fighter Weight": "227¾", "Opponent": "Fighter_2", "Opponent Weight": "211", "result": "W-SD", "rounds": "12/12" } ]
这种格式处理更灵活,直接用pd.DataFrame()转换后,通过set_index(['fight_number', 'fighter_id']).unstack('fighter_id')即可快速生成目标结构,后续扩展多个拳手或新增字段时无需调整嵌套逻辑。
内容的提问来源于stack exchange,提问作者InvestingScientist
相关产品推荐
相关产品推荐

