基于两个Pandas DataFrame计算对手平均数据并生成预期值新列
解决方案
实现逻辑:先将赛程表转为长表结构匹配对手数据,分组求平均值后合并回原数据表即可,该方法可自动适配任意数量的对手列,无需随赛季周数调整代码。
import pandas as pd # 初始数据 data = {'Name':['Edgar', 'Ralph', 'Marc', 'David'], 'STAT1':[100, 96, 110, 103], 'STAT2':[116, 93, 85, 100], 'STAT3':[56, 59, 41, 83], 'STAT4':[55, 96, 113, 40],} data2 = {'Name':['Edgar', 'Ralph', 'Marc', 'David'], 'Opp1':['Ralph', 'Edgar', 'David', 'Marc'], 'Opp2':['Ralph', 'Edgar', 'David', 'Marc'], 'Opp3':['Marc', 'David', 'Edgar', 'Ralph'], 'Opp4':['David', 'Marc', 'Ralph', 'Edgar'], 'Opp5':['Ralph', 'Edgar', 'David', 'Marc'],} df = pd.DataFrame(data) df_Schedule = pd.DataFrame(data2) # 核心处理逻辑 ## 1. 把宽格式赛程转为长格式,每行对应一场对阵的运动员和对手 sched_long = df_Schedule.melt(id_vars='Name', value_name='Opponent').drop('variable', axis=1) ## 2. 匹配每个对手的STAT数据 opp_stat_matched = sched_long.merge(df, left_on='Opponent', right_on='Name', suffixes=('', '_opp')) ## 3. 按运动员分组计算各STAT的平均值,重命名为EXP开头的列 exp_df = opp_stat_matched.groupby('Name', as_index=False)[['STAT1', 'STAT2', 'STAT3', 'STAT4']].mean().rename(columns=lambda col: f"EXP{col[-1]}") ## 4. 合并回原数据表得到最终结果 df_final = df.merge(exp_df, on='Name') print(df_final)
运行输出与预期完全一致:
Name STAT1 STAT2 STAT3 STAT4 EXP1 EXP2 EXP3 EXP4 0 Edgar 100 116 56 55 100.2 92.8 60.2 88.2 1 Ralph 96 93 59 96 102.6 106.6 58.4 63.6 2 Marc 110 85 41 113 101.0 101.8 72.8 54.2 3 David 103 100 83 40 105.2 92.8 47.6 98.0
内容的提问来源于stack exchange,提问作者mgadfly
相关产品推荐
相关产品推荐

