如何为多联赛字典生成带表头与子表头的Pandas DataFrame?
实现带有多级表头的体育赛事数据DataFrame
需求说明
我有一个包含约15个动态变化联赛的字典,数据示例如下:
sports_data = { 'NFL': [ {'Name': 'Taysom Hill', 'Line': '0.5', 'Prop': 'Pass Yards'}, {'Name': 'Derek Carr', 'Line': '238.5', 'Prop': 'Pass Yards'}, {'Name': 'Jared Goff', 'Line': '251.5', 'Prop': 'Pass Yards'} ], 'MLB': [ {'Name': 'Brandon Pfaadt', 'Line': '4.0','Prop': 'Pitcher Strikeouts'}, {'Name': 'Ranger Suárez', 'Line': '3.0', 'Prop': 'Pitcher Strikeouts'}, {'Name': 'Trea Turner', 'Line': '1.5', 'Prop': 'Total Bases'} ] }
需要将其转换为带有**一级表头(联赛名)和二级子表头(Name、Line、Prop)**的DataFrame,预期格式如下:
**NFL** **MLB** Name Line Prop Name Line Prop 1 Taysom Hill 0.5 Pass Yards Brandon Pfaadt 4.0 Pitcher Strikeouts 2 Derek Carr 238.5 Pass Yards Ranger Suárez 3.0 Pitcher Strikeouts 3 Jared Goff 251.5 Pass Yards Trea Turner 1.5 Total Bases
作为Python新手,尝试多种代码后未得到目标格式,部分代码仅输出一行结果,请问该需求是否可实现?如何解决?
解决方案
该需求完全可以实现,利用pandas的**多级列索引(MultiIndex)**即可完成,具体步骤如下:
1. 导入pandas库
import pandas as pd
2. 遍历字典生成带多级列的子DataFrame
遍历每个联赛数据,将列表转为DataFrame,并为其设置多级列:一级列名为联赛名,二级列名为原数据的键(Name、Line、Prop)。
3. 横向拼接所有子DataFrame
使用pd.concat()将所有子DataFrame按列方向拼接,形成最终的多级表头DataFrame。
4. 调整行索引(可选)
将行索引从0开始改为从1开始,匹配示例格式。
完整代码
import pandas as pd sports_data = { 'NFL': [ {'Name': 'Taysom Hill', 'Line': '0.5', 'Prop': 'Pass Yards'}, {'Name': 'Derek Carr', 'Line': '238.5', 'Prop': 'Pass Yards'}, {'Name': 'Jared Goff', 'Line': '251.5', 'Prop': 'Pass Yards'} ], 'MLB': [ {'Name': 'Brandon Pfaadt', 'Line': '4.0','Prop': 'Pitcher Strikeouts'}, {'Name': 'Ranger Suárez', 'Line': '3.0', 'Prop': 'Pitcher Strikeouts'}, {'Name': 'Trea Turner', 'Line': '1.5', 'Prop': 'Total Bases'} ] } # 生成子DataFrame列表 df_list = [] for league, data in sports_data.items(): df = pd.DataFrame(data) # 设置多级列:(联赛名, 子表头) df.columns = pd.MultiIndex.from_tuples([(league, col) for col in df.columns]) df_list.append(df) # 横向拼接所有子DataFrame final_df = pd.concat(df_list, axis=1) # 调整行索引从1开始 final_df.index = final_df.index + 1 print(final_df)
代码说明
pd.MultiIndex.from_tuples():将联赛名和子表头组合成元组,生成多级列索引,这是实现双层表头的核心。pd.concat(df_list, axis=1):按列方向拼接多个DataFrame,保证不同联赛的子表头横向排列。- 行索引调整:通过
index + 1让行号从1开始,和示例格式一致。
输出效果
运行代码后,输出的DataFrame会和预期格式完全一致,且支持动态扩展任意数量的联赛。
内容的提问来源于stack exchange,提问作者K D
相关产品推荐
相关产品推荐

