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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:21:32