使用Python筛选NBA球员背靠背比赛数据的技术方案
筛选NBA球员背靠背比赛数据的解决方案
问题说明
我有一个NBA数据集,包含Player(球员)和Game_date(比赛日期)字段,示例数据如下:
| Player | Game_date |
|---|---|
| Lebron James | 2023-10-11 |
| Lebron James | 2023-10-12 |
| Lebron James | 2023-10-18 |
| Kobe Bryant | 2023-11-02 |
| Kobe Bryant | 2023-11-03 |
| Kobe Bryant | 2023-11-09 |
需要筛选出仅包含球员**背靠背(连续两天)**的比赛数据,目标结果如下:
| Player | Game_date |
|---|---|
| Lebron James | 2023-10-11 |
| Lebron James | 2023-10-12 |
| Kobe Bryant | 2023-11-02 |
| Kobe Bryant | 2023-11-03 |
创建数据集的代码如下:
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) print(df)
我尝试了以下代码,但需要完善实现逻辑:
# Convert 'game_date' column to datetime format df['game_date'] = pd.to_datetime(df['game_date']).dt.date # Sort DataFrame by player_id and game_date df.sort_values(by=['player_name', 'game_date'], inplace=True) # Calculate the difference between consecutive game dates and store the result in 'b2b' column df['b2b'] = df.groupby('player_name')['game_date'].apply(lambda x:x.diff().fillna(pd.Timedelta(days=0))).dt.days
完善实现方案
你的尝试代码存在列名不匹配(原数据列是Player/Game_date,代码里用了player_name/game_date)以及缺少最终筛选逻辑的问题,以下是完整可运行的解决方案:
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) # 1. 将日期列转换为datetime类型(保留datetime格式,方便时间差计算) df['Game_date'] = pd.to_datetime(df['Game_date']) # 2. 按球员姓名和比赛日期排序,确保连续场次相邻 df.sort_values(by=['Player', 'Game_date'], inplace=True) # 3. 分组计算每个球员连续两场比赛的天数差 df['days_diff'] = df.groupby('Player')['Game_date'].diff().dt.days # 4. 标记所有属于背靠背的场次:当前场次与下一场差1天,或与上一场差1天 df['is_b2b'] = (df['days_diff'] == 1) | (df['days_diff'].shift(-1) == 1) # 5. 筛选出背靠背场次,删除辅助列 result_df = df[df['is_b2b']].drop(columns=['days_diff', 'is_b2b']) print(result_df)
关键逻辑说明
- 保留
Game_date的datetime类型,避免转成date类型后无法直接计算时间差 - 分组计算日期差后,通过
shift(-1)来标记连续两天的第一场比赛(因为第一场的days_diff是NaN,但第二场的days_diff是1,所以第一场需要通过下一场的标记来识别) - 最终筛选出所有标记为背靠背的场次,得到目标结果
内容的提问来源于stack exchange,提问作者Sam Ash
相关产品推荐
相关产品推荐

