如何在DataFrame中计算并添加主客队距各自上一场比赛的天数差列
解决方法:计算球队距上一场比赛的间隔天数
这个需求在体育赛事数据分析里挺常见的,我来给你提供一个清晰的Pandas实现方案,完全符合你想要的结果:
步骤说明
核心思路是先统一整理所有球队的比赛记录(不管主客场),计算每支球队相邻比赛的间隔天数,再把结果映射回原始DataFrame中。
1. 准备数据并转换日期类型
首先要确保日期列是datetime格式,否则无法进行时间差计算:
import pandas as pd # 构建你的示例DataFrame data = { 'Date': ['2026-05-10', '2026-05-11', '2026-05-13', '2026-05-13'], 'team_home': ['Tottenham', 'Liverpool', 'West Ham', 'Arsenal'], 'team_away': ['Arsenal', 'West Ham', 'Chelsea', 'Liverpool'] } df = pd.DataFrame(data) # 转换Date列为datetime类型(关键步骤) df['Date'] = pd.to_datetime(df['Date'])
2. 整理所有球队的比赛记录
把主队和客队的比赛记录合并,形成"球队-比赛日期"的统一结构:
# 提取主队比赛记录 home_games = df[['team_home', 'Date']].rename(columns={'team_home': 'team', 'Date': 'game_date'}) # 提取客队比赛记录 away_games = df[['team_away', 'Date']].rename(columns={'team_away': 'team', 'Date': 'game_date'}) # 合并所有比赛记录并按球队、日期排序 all_games = pd.concat([home_games, away_games]).sort_values(['team', 'game_date'])
3. 计算每支球队的比赛间隔天数
对每支球队的比赛日期分组,计算相邻比赛的间隔天数,首次比赛的间隔设为0:
# 计算间隔天数,首次比赛填充0 all_games['days_since_last'] = all_games.groupby('team')['game_date'].diff().dt.days.fillna(0)
4. 将间隔天数映射回原始DataFrame
用merge方法(比apply效率更高)把计算好的间隔值匹配到主队和客队对应的列:
# 匹配主队的间隔天数 home_merge = df.merge(all_games, left_on=['team_home', 'Date'], right_on=['team', 'game_date'], how='left') df['home_diff'] = home_merge['days_since_last'] # 匹配客队的间隔天数 away_merge = df.merge(all_games, left_on=['team_away', 'Date'], right_on=['team', 'game_date'], how='left') df['away_diff'] = away_merge['days_since_last']
验证结果
运行上述代码后,打印df会得到你期望的结果:
Date team_home team_away home_diff away_diff 0 2026-05-10 Tottenham Arsenal 0.0 0.0 1 2026-05-11 Liverpool West Ham 0.0 0.0 2 2026-05-13 West Ham Chelsea 2.0 0.0 3 2026-05-13 Arsenal Liverpool 3.0 2.0
关键细节说明
- 为什么要合并主客场记录?因为一支球队的比赛可能是主场也可能是客场,统一处理才能准确计算所有比赛的间隔。
- 用
merge代替apply:当你的DataFrame数据量很大时,merge的运行效率会远高于apply,避免性能瓶颈。 - 日期转换的重要性:如果
Date列是字符串类型,diff()方法无法计算时间差,必须先转换为datetime格式。
内容的提问来源于stack exchange,提问作者AjWinston




