Pandas中按条件计算各队最长连续主场胜场链长度
计算足球队最长连续主场胜场方案
原始数据
原始数据集为足球赛事记录DataFrame,包含date(比赛日期)、home_team(主队)、away_team(客队)、home_score(主队得分)、away_score(客队得分)5个字段,构造代码如下:
import pandas as pd df = pd.DataFrame({ "date":['2021-06-02', '2021-06-07', '2021-06-15', '2021-06-19', '2021-06-23', '2021-09-05', '2021-10-08', '2021-11-11', '2022-03-26', '1950-05-28', '1953-10-11', '1954-06-01', '1955-05-28', '1955-10-30', '1956-12-16', '1957-10-27', '1958-02-20', '1959-11-21', '1960-02-07', '1960-07-03'], "home_team":['Germany', 'Germany', 'Germany', 'Germany', 'Germany', 'Germany', 'Germany', 'Germany', 'Germany', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana', 'Ghana'], "away_team":['Denmark', 'Latvia', 'France', 'Portugal', 'Hungary', 'Armenia', 'Romania', 'Liechtenstein', 'Israel', 'Nigeria', 'Nigeria', 'Sierra Leone', 'Nigeria', 'Nigeria', 'Sierra Leone', 'Nigeria', 'Togo', 'Nigeria', 'Sierra Leone', 'Egypt'], "home_score":[1, 7, 0, 4, 2, 6, 2, 9, 2, 1, 1, 2, 1, 7, 4, 3, 5, 5, 6, 2], "away_score":[1, 1, 1, 2, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, 2, 2, 2] })
需求为计算每支队伍的最长连续主场胜场长度,期望输出格式如下:
Team HomeWinChain 0 Germany 4 1 Ghana 6
实现思路
连续场次计算的核心是先保证比赛按时间顺序排列,再通过累计求和标记连续胜场段:
- 先将日期列转为时间类型,按主队+比赛日期排序,避免原始数据顺序错乱导致连续计算错误
- 新增字段标记单场比赛主队是否获胜(主队得分>客队得分记为胜)
- 按主队分组,对胜场标记做累计求和:每遇到非胜场(平/负),累计值+1,同一连续胜场段的累计值相同,以此区分不同的连胜段
- 筛选出所有胜场记录,按主队+连胜段分组统计段长度,每个主队取最长段的长度即为结果
完整实现代码
# 1. 日期格式转换 + 按主队、比赛时间排序,保证场次顺序正确 df['date'] = pd.to_datetime(df['date']) df = df.sort_values(by=['home_team', 'date']).reset_index(drop=True) # 2. 标记单场主队是否赢球 df['is_home_win'] = df['home_score'] > df['away_score'] # 3. 给每个连续胜场段生成唯一id:遇到非赢球场次,段id+1 df['win_streak_id'] = df.groupby('home_team')['is_home_win'].apply(lambda x: (~x).cumsum()).reset_index(drop=True) # 4. 统计每个胜场段的长度,取每个队的最大值 longest_win = df[df['is_home_win']] \ .groupby(['home_team', 'win_streak_id']) \ .size() \ .groupby('home_team') \ .max() \ .reset_index() # 5. 重命名列对齐输出格式 longest_win.columns = ['Team', 'HomeWinChain'] print(longest_win)
运行结果
执行上述代码后输出结果完全匹配预期:
Team HomeWinChain 0 Germany 4 1 Ghana 6
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

