如何匹配行列数据,为体育数据集新增对手平均净胜分列至DataFrame
实现代码如下
逻辑说明:先按赛季存储所有球队的平均净胜分映射,再逐行计算当前球队和各对手的交手场次,乘以对应对手的净胜分求和后除以总场次即可得到目标值,完整实现代码:
import pandas as pd # 构造数据集,如果你是从本地文件读取,直接替换为pd.read_csv等对应读取方法即可 data = [ [2015, 'sharks', 'shk', '0-0', '1-3', '2-0', '4-1', '3-2', 1.2], [2015, 'dogs', 'dgs', '3-1', '0-0', '2-1', '1-1', '2-0', 3.4], [2015, 'bears', 'brs', '0-2', '1-2', '0-0', '1-3', '2-1', -0.2], [2015, 'cats', 'cts', '1-4', '1-1', '3-1', '0-0', '2-2', 2.0], [2015, 'cows', 'cws', '2-3', '0-2', '1-2', '2-2', '0-0', -2.1], [2014, 'sharks', 'shk', '0-0', '1-3', '2-0', '4-1', '3-2', 0.7], [2014, 'dogs', 'dgs', '3-1', '0-0', '2-1', '1-1', '2-0', 1.8], [2014, 'bears', 'brs', '0-2', '1-2', '0-0', '1-3', '2-1', -1.9], [2014, 'cats', 'cts', '1-4', '1-1', '3-1', '0-0', '2-2', 2.3], [2014, 'cows', 'cws', '2-3', '0-2', '1-2', '2-2', '0-0', -3.0] ] columns = ['season', 'team', 'tm', 'shk', 'dgs', 'brs', 'cts', 'cws', 'avg_pt_marg'] df = pd.DataFrame(data, columns=columns) # 按赛季生成「队缩写-平均净胜分」的映射字典 season_marg_map = df.groupby('season').apply( lambda x: dict(zip(x['tm'], x['avg_pt_marg'])) ).to_dict() # 所有对手列的列名 opp_cols = ['shk', 'dgs', 'brs', 'cts', 'cws'] # 单行数据的计算逻辑 def calc_opp_marg(row): season = row['season'] self_tm = row['tm'] marg_map = season_marg_map[season] total_weighted = 0 total_games = 0 for opp_tm in opp_cols: # 跳过和自身的交手记录 if opp_tm == self_tm: continue # 拆分比分计算总交手场次 win, lose = map(int, row[opp_tm].split('-')) games = win + lose total_weighted += games * marg_map[opp_tm] total_games += games return total_weighted / total_games # 生成新列 df['opponent_marg'] = df.apply(calc_opp_marg, axis=1) # 查看结果 print(df)
运行后得到的df就包含你需要的opponent_marg列,其中2015年sharks的计算结果和你给出的示例完全匹配。
内容的提问来源于stack exchange,提问作者yoyoman32
相关产品推荐
相关产品推荐

