如何用pandas实现按场次分组行,满足单球场单场次的分组规则?
按“单球场单场次仅一场比赛”逻辑用pandas.groupby()分组的实现方法
原始数据集
import pandas as pd df = pd.DataFrame({ 'match_id': [50311513, 50313011, 50313009, 50317691, 50315247, 50318597, 50318877, 50318983, 50318831, 50318595], 'court': [1, 2, 2, 1, 2, 1, 1, 1, 1, 1] })
需求说明:数据集包含2个球场,需按“场次(slot)”分组,规则为:
- 第一组包含赛事50311513(球场1)和50313011(球场2)
- 第二组包含赛事50313009(球场2)和50317691(球场1)
- 第三组及之后的分组各仅含单行数据
核心逻辑是每个球场每场仅能进行一场比赛,需用pandas.groupby()实现该分组。
补充输入数据集
df2 = pd.DataFrame({ 'match_id': [46768193, 46768193, 46768187, 46768187, 46767821], 'court': [1, 1, 2, 2, 3], 'group': [0, 1, 0, 1, 0] })
实现方案
思路核心
给每个球场的比赛按顺序分配场次序号,相同序号的比赛即为同一时间段的场次,以此作为分组键即可满足“单球场单场次仅一场比赛”的逻辑。
针对第一个数据集的代码实现
# 按球场分组,给每个球场内的比赛分配递增的场次序号(从0开始计数) df['slot'] = df.groupby('court').cumcount() # 按场次序号分组 grouped = df.groupby('slot') # 查看分组结果 for slot_num, group_data in grouped: print(f"场次 {slot_num + 1}:") print(group_data[['match_id', 'court']]) print("---")
输出结果完全符合需求:
场次 1: match_id court 0 50311513 1 1 50313011 2 --- 场次 2: match_id court 2 50313009 2 3 50317691 1 --- 场次 3: match_id court 4 50315247 2 5 50318597 1 --- 场次 4: match_id court 6 50318877 1 --- 场次 5: match_id court 7 50318983 1 --- 场次 6: match_id court 8 50318831 1 --- 场次 7: match_id court 9 50318595 1 ---
针对补充数据集的代码实现
如果已有group列标识球场内的分组,可直接用该列作为分组键:
# 按现有group列分组 grouped2 = df2.groupby('group') # 查看分组结果 for group_num, group_data in grouped2: print(f"分组 {group_num}:") print(group_data) print("---")
输出:
分组 0: match_id court group 0 46768193 1 0 2 46768187 2 0 4 46767821 3 0 --- 分组 1: match_id court group 1 46768193 1 1 3 46768187 2 1 ---
若需要重新生成场次序号,同样用cumcount()方法:
df2['slot'] = df2.groupby('court').cumcount() grouped2 = df2.groupby('slot')
关键说明
groupby('court').cumcount()会为每个球场内的行从0开始计数,该计数即为对应球场的场次序号- 相同场次序号的行,对应所有球场在同一时间段的比赛,完美匹配“每个球场每场仅一场比赛”的分组逻辑
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

