You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:35:09