如何用Pandas高效计算球员被替换的离场时间?
问题描述
我用足球比赛场景来举例:现有一张记录球员登场信息的表格:
player | position | start minute ------------------------------ Bob | keeper | 0 Pedro | Center Midfielder | 0 Joe | Striker | 0 Tim | Center Midfielder | 20
需要添加end minute列记录球员被换下场的时间:
- 同一位置下,后登场球员的
start minute就是前一位该位置球员的end minute(比如Pedro在第20分钟被同位置的Tim替换下场) - 若没有后续球员替换,下场时间为90分钟
- 最终可计算
play duration(end minute与start minute的差值)
目前仅能通过暴力法处理单次替换场景,需要支持无限次替换的简洁Pandas实现方式。
解决方案
可以通过按位置分组后,利用shift方法获取下一位球员的登场时间来实现,这是支持无限次替换的高效方案:
核心思路
- 按
position分组,确保每组内的球员按登场时间排序(如果原始数据未排序,需先执行排序操作) - 对每组的
start minute调用shift(-1),拿到下一位球员的登场时间,这就是当前球员的下场时间 - 把没有后续替换的球员的
end minute填充为90 - 计算上场时长
代码实现
import pandas as pd # 构造示例数据 data = { 'player': ['Bob', 'Pedro', 'Joe', 'Tim'], 'position': ['keeper', 'Center Midfielder', 'Striker', 'Center Midfielder'], 'start minute': [0, 0, 0, 20] } df = pd.DataFrame(data) # 按位置分组,获取下一位球员的登场时间作为end minute df['end minute'] = df.groupby('position')['start minute'].shift(-1) # 填充无替换球员的下场时间为90 df['end minute'] = df['end minute'].fillna(90) # 计算上场时长 df['play duration'] = df['end minute'] - df['start minute'] # 查看结果 print(df)
输出结果
player position start minute end minute play duration 0 Bob keeper 0 90.0 90.0 1 Pedro Center Midfielder 0 20.0 20.0 2 Joe Striker 0 90.0 90.0 3 Tim Center Midfielder 20 90.0 70.0
适配多次替换场景
如果同一位置有多次替换(比如同一位置有3位及以上球员先后登场),这个方法依然适用。shift(-1)会自动获取每组内下一条记录的start minute,完美支持无限次替换的需求。比如新增一名第60分钟登场的Center Midfielder球员,代码会自动把Tim的end minute设为60,新球员的end minute设为90。
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

