如何在循环中按Group和Match分组实现正确的球队对阵展示?
问题描述
现有如下DataFrame数据:
| Group | Match | Team |
|---|---|---|
| A | 1 | A1 |
| A | 1 | A2 |
| A | 2 | A3 |
| A | 2 | A4 |
我编写了这段代码:
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
相关产品推荐
相关产品推荐

