如何高效用Pandas按索引匹配DataFrame并计算联盟统计总和?
高效计算赛事对阵表中联盟球队统计值之和(Pandas实现)
问题背景
我有一份赛事对阵表(以多层列索引组织的Pandas DataFrame),以及各球队的统计平均值DataFrame,需要计算每场比赛里红蓝联盟各自两支球队的平均值之和,要求不用遍历整个DataFrame,采用更高效的实现方式。
原始数据
赛事对阵表DataFrame
red alliance blue alliance team1 team2 team1 team2 1 1 2 3 4 2 1 3 2 4 3 4 1 3 2
球队统计平均值DataFrame
average score average penalties team 1 6.2 1.1 2 9.5 0.2 3 4.0 1.3 4 3.3 0.5
预期结果
需要在对阵表中为红蓝联盟各新增averageScore和averagePenalties列,最终结果如下:
red alliance blue alliance team1 team2 averageScore averagePenalties team1 team2 averageScore averagePenalties 1 1 2 15.7 1.3 3 4 7.3 1.8 2 1 3 10.2 2.4 2 4 12.8 0.7 3 4 1 7.3 1.8 3 2 13.5 1.5
高效实现方案
可以利用Pandas的向量化索引操作完成计算,完全不需要遍历每一行,效率远高于循环方式。具体步骤如下:
1. 修正并准备数据
首先确保球队统计DataFrame的索引为整数类型(如果原始数据索引带有多余符号,先清理):
import pandas as pd # 构建赛事对阵表 matchups = pd.DataFrame( [[1,2,3,4], [1,3,2,4], [4,1,3,2]], columns=pd.MultiIndex.from_tuples( [('red alliance', 'team1'), ('red alliance', 'team2'), ('blue alliance', 'team1'), ('blue alliance', 'team2')] ), index=[1,2,3] ) # 构建球队统计数据表 stats = pd.DataFrame( {'average score': [6.2,9.5,4.0,3.3], 'average penalties': [1.1,0.2,1.3,0.5]}, index=[1,2,3,4] )
2. 向量化计算联盟统计值之和
通过索引直接定位球队的统计数据,然后进行向量相加,生成新列:
# 计算红联盟的得分与罚分之和 matchups[('red alliance', 'averageScore')] = ( stats.loc[matchups[('red alliance', 'team1')], 'average score'].values + stats.loc[matchups[('red alliance', 'team2')], 'average score'].values ) matchups[('red alliance', 'averagePenalties')] = ( stats.loc[matchups[('red alliance', 'team1')], 'average penalties'].values + stats.loc[matchups[('red alliance', 'team2')], 'average penalties'].values ) # 计算蓝联盟的得分与罚分之和 matchups[('blue alliance', 'averageScore')] = ( stats.loc[matchups[('blue alliance', 'team1')], 'average score'].values + stats.loc[matchups[('blue alliance', 'team2')], 'average score'].values ) matchups[('blue alliance', 'averagePenalties')] = ( stats.loc[matchups[('blue alliance', 'team1')], 'average penalties'].values + stats.loc[matchups[('blue alliance', 'team2')], 'average penalties'].values )
方案优势
- 完全基于Pandas向量化操作,避免了Python级别的循环遍历,数据量越大,效率提升越明显
- 利用Pandas索引的快速查找特性,直接定位对应球队的统计数据,逻辑清晰且执行高效
内容的提问来源于stack exchange,提问作者SandstormNorth
相关产品推荐
相关产品推荐

