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

如何在循环中按Group和Match分组实现正确的球队对阵展示?

问题描述

现有如下DataFrame数据:

GroupMatchTeam
A1A1
A1A2
A2A3
A2A4

我编写了这段代码:

from itertools import combinations

for group in set(world_cup['Group']):
    print('___Starting group {}:___'.format(group))
    for home, away in combinations(world_cup.query('Group == "{}"'.format(group)).index, 2):
        # 后续逻辑
        print(f"{world_cup.loc[home, 'Team']}-{world_cup.loc[away, 'Team']}")

现在输出的是同组内所有球队的两两组合:

___Starting group A:__
A1-A2
A1-A3
A1-A4
A2-A3
A2-A4
A3-A4

但我需要按Match分组展示对阵,期望输出是:

___Starting group A:__
A1-A2
A3-A4
解决方案

核心问题是你现在的逻辑是对整个小组的所有球队做全量两两组合,没有按Match字段拆分场次。正确的思路是先按Group+Match双层分组,再在每个场次的子组内生成对阵。

方法一(兼容多球队场景)

如果后续可能出现单场次多球队的特殊赛制,可以保留combinations逻辑:

from itertools import combinations

# 按"小组+场次"双层分组
grouped_matches = world_cup.groupby(['Group', 'Match'])

current_group = None
for (group, match), match_data in grouped_matches:
    # 仅在切换小组时打印组标题
    if group != current_group:
        print(f'___Starting group {group}:___')
        current_group = group
    # 提取当前场次的所有球队
    teams = match_data['Team'].tolist()
    # 生成两两对阵(单场次2队时只会出一组结果)
    for home, away in combinations(teams, 2):
        print(f'{home}-{away}')

方法二(固定2队场次的简化写法)

如果每个场次固定只有2支球队,可以直接取子组内的两支球队拼接,更高效:

grouped_matches = world_cup.groupby(['Group', 'Match'])

current_group = None
for (group, match), match_data in grouped_matches:
    if group != current_group:
        print(f'___Starting group {group}:___')
        current_group = group
    # 直接取子组的第一和第二个球队
    print(f'{match_data.iloc[0]["Team"]}-{match_data.iloc[1]["Team"]}')

错误原因说明

原来的combinations(world_cup.query('Group == "{}"'.format(group)).index, 2)是对整个小组的所有行索引做两两组合,相当于把小组里的所有球队拉出来全配对,自然会出现跨场次的错误组合。而用groupby(['Group', 'Match'])拆分后,每个子组只对应一场比赛的球队,配对逻辑就正确了。

内容的提问来源于stack exchange,提问作者Kon Wes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:05:59