
本文介绍使用 pandas 对球员比赛日期进行分组分析,精准识别连续两天(back-to-back)参赛的记录,并保留所有相关行(包括起始日和次日),适用于大规模 nba 赛程数据集。
本文介绍使用 pandas 对球员比赛日期进行分组分析,精准识别连续两天(back-to-back)参赛的记录,并保留所有相关行(包括起始日和次日),适用于大规模 nba 赛程数据集。
在 NBA 数据分析中,“背靠背”(Back-to-Back, B2B)指同一球员连续两天出战正式比赛,是评估球员负荷、体能调度与战术安排的重要指标。要从原始赛程表中完整提取所有 B2B 记录,关键在于:不仅识别出“次日是否为前一日+1天”,还需确保“前一日”本身也被纳入结果——即每一对连续日期的两条记录都应保留。
以下是一个简洁、高效且可扩展的解决方案(基于 pandas 2.0+):
✅ 正确做法:使用 transform + diff + shift
import pandas as pd
# 构建示例数据
data = [
{'Player': 'Lebron James', 'Game_date': '2023-10-11'},
{'Player': 'Lebron James', 'Game_date': '2023-10-12'},
{'Player': 'Lebron James', 'Game_date': '2023-10-18'},
{'Player': 'Kobe Bryant', 'Game_date': '2023-11-02'},
{'Player': 'Kobe Bryant', 'Game_date': '2023-11-03'},
{'Player': 'Kobe Bryant', 'Game_date': '2023-11-09'},
]
df = pd.DataFrame(data)
# ⚠️ 关键前提:必须转换为 datetime(非 date 类型!)
df['Game_date'] = pd.to_datetime(df['Game_date'])
# 核心逻辑:按球员分组,标记“当前行是B2B起点或终点”
mask = df.groupby('Player')['Game_date'].transform(
lambda g: (g.diff().dt.days == 1) | (g.diff().dt.days == 1).shift(-1)
)
# 应用布尔索引,获取全部背靠背记录
b2b_df = df[mask].copy().reset_index(drop=True)
print(b2b_df)
输出结果:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
Player Game_date 0 Lebron James 2023-10-11 1 Lebron James 2023-10-12 2 Kobe Bryant 2023-11-02 3 Kobe Bryant 2023-11-03
? 原理详解
- g.diff().dt.days == 1:判断当前行是否为某次 B2B 的“第二日”(即比前一行晚 1 天)→ 得到布尔 Series m;
- m.shift(-1):将该布尔值向上移动一行,使 True 落在“第一日”位置;
- (m | m.shift(-1)):逻辑或操作后,B2B 的两行均标记为 True;
- transform 确保结果长度与原 DataFrame 一致,支持直接布尔索引。
? 注意:若某球员存在多段 B2B(如 2023-12-11, 2023-12-12, 2023-12-18, 2023-12-19),该方法仍能准确捕获所有四条记录,无遗漏。
⚠️ 常见错误与避坑指南
- ❌ 错误:使用 .dt.date 转为 date 类型 → 丢失 diff() 所需的 timedelta 运算能力;
- ❌ 错误:仅用 diff() == 1 筛选 → 只保留“第二日”,漏掉“第一日”;
- ❌ 错误:未 sort_values(['Player', 'Game_date']) → 分组内日期乱序导致 diff 结果错误(本例数据已有序,但生产环境务必显式排序);
- ✅ 最佳实践:添加预处理排序保障鲁棒性:
df = df.sort_values(['Player', 'Game_date']).reset_index(drop=True)
? 总结
识别背靠背比赛不是简单的“相邻差值判断”,而是双向关联问题。本文方案以 transform 为核心,结合 diff 与 shift(-1) 实现语义完整的匹配逻辑,代码简短、性能优异(向量化)、可无缝应用于百万级赛事记录。无论是用于负荷分析、伤病建模还是赛程优化,该方法都提供了可靠的数据清洗基础。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










