基于另一DataFrame索引创建列:匹配Season与Home添加全明星数量列
解决方案:匹配球队赛季全明星人数到比赛数据
没问题,这事儿咱们一步步来搞定,用Pandas就能轻松实现需求:
步骤1:给比赛DataFrame生成Season列
首先得从Date字段里提取对应的NBA赛季规则:每年10月到次年9月属于同一个赛季,比如2012年11月的比赛属于2012-13赛季,2013年5月的比赛也归属于2012-13赛季。假设你的Date是字符串类型,先转成datetime再处理:
import pandas as pd # 转换Date为datetime类型(如果还没转的话) games_df['Date'] = pd.to_datetime(games_df['Date']) # 生成赛季字段 games_df['Season'] = games_df['Date'].apply( lambda x: f"{x.year}-{x.year+1}" if x.month >= 10 else f"{x.year-1}-{x.year}" )
步骤2:转换全明星人数DataFrame的格式
你的全明星数据现在是宽表结构(球队为索引,赛季为列),咱们需要把它转成长表结构,这样才能和比赛表做精准匹配。假设这个表叫all_stars_df:
# 转成长表,重置索引后得到三列:球队名称、赛季、全明星人数 all_stars_long = all_stars_df.reset_index().melt( id_vars=['index'], var_name='Season', value_name='Home_All_Stars' ).rename(columns={'index': 'Home'})
转换后的all_stars_long结构示例:
| Home | Season | Home_All_Stars |
|---|---|---|
| Cleveland Cavaliers | 2012-13 | 1 |
| Los Angeles Lakers | 2012-13 | 2 |
| ... | ... | ... |
步骤3:合并两个DataFrame
现在通过Home(主队名称)和Season(赛季)两个字段,把全明星人数匹配到比赛表中:
# 左连接,保留比赛表的所有数据,匹配不到的记录会显示NaN final_df = games_df.merge(all_stars_long, on=['Home', 'Season'], how='left')
完成后final_df会新增一列Home_All_Stars,就是对应赛季主队的全明星总人数啦~
如果遇到球队名称不匹配的情况(比如比赛表用LA Lakers,全明星表用Los Angeles Lakers),记得先统一两边的球队名称格式,确保匹配准确。
内容的提问来源于stack exchange,提问作者stretchy
相关产品推荐
相关产品推荐

