Pandas按player_id计算每条记录距上一场比赛的天数
解决DataFrame新增球员上一场比赛间隔天数列的问题
我来帮你搞定这个需求!你需要给每个球员的每条比赛记录计算距离上一场的天数,首条记录显示nan。这里的关键是必须先按球员和比赛日期排序,不然直接计算会因为记录顺序混乱得到错误结果。
完整实现步骤
- 确保日期列是datetime类型:如果你的
match_date是字符串格式,先转成datetime才能计算天数差。 - 按球员和日期排序:把每个球员的记录按比赛时间从早到晚排列,这样才能正确获取上一场的日期。
- 分组计算间隔天数:按
player_id分组后,用shift()获取同组内上一条记录的日期,再计算当前日期与上一条的差值,提取天数。
代码示例
首先我们先创建你提供的示例数据:
import pandas as pd data = { 'event_id': [1470993, 1492031, 1489240, 1495581, 1490222, 1469624, 1493822, 1428946, 1483245, 1472260], 'player_id': [227485, 227485, 227485, 227485, 227485, 227485, 227485, 313444, 313444, 313444], 'match_date': ['2015-11-29', '2016-07-23', '2016-06-19', '2016-09-02', '2016-07-03', '2015-11-14', '2016-08-13', '2014-08-10', '2016-05-21', '2015-12-13'] } df = pd.DataFrame(data)
接下来执行处理步骤:
# 1. 转换日期列类型 df['match_date'] = pd.to_datetime(df['match_date']) # 2. 按player_id和match_date升序排序 df_sorted = df.sort_values(by=['player_id', 'match_date']).reset_index(drop=True) # 3. 计算days_since_last df_sorted['days_since_last'] = df_sorted.groupby('player_id')['match_date'].diff().dt.days
最终结果
处理后的df_sorted会是这样:
| event_id | player_id | match_date | days_since_last |
|---|---|---|---|
| 1469624 | 227485 | 2015-11-14 | NaN |
| 1470993 | 227485 | 2015-11-29 | 15.0 |
| 1489240 | 227485 | 2016-06-19 | 203.0 |
| 1490222 | 227485 | 2016-07-03 | 14.0 |
| 1492031 | 227485 | 2016-07-23 | 20.0 |
| 1493822 | 227485 | 2016-08-13 | 21.0 |
| 1495581 | 227485 | 2016-09-02 | 20.0 |
| 1428946 | 313444 | 2014-08-10 | NaN |
| 1472260 | 313444 | 2015-12-13 | 490.0 |
| 1483245 | 313444 | 2016-05-21 | 160.0 |
为什么要排序?
你提供的原始数据里,同一个球员的记录是乱序的(比如player_id=227485的第一条记录是2015-11-29,但更早的2015-11-14在第5行)。如果不先排序就直接用groupby+shift,计算出来的间隔天数会是基于原始乱序的记录,结果完全错误。排序这一步是关键!
内容的提问来源于stack exchange,提问作者L1meta




