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

使用Python筛选NBA球员背靠背比赛数据的技术方案

筛选NBA球员背靠背比赛数据的解决方案

问题说明

我有一个NBA数据集,包含Player(球员)和Game_date(比赛日期)字段,示例数据如下:

PlayerGame_date
Lebron James2023-10-11
Lebron James2023-10-12
Lebron James2023-10-18
Kobe Bryant2023-11-02
Kobe Bryant2023-11-03
Kobe Bryant2023-11-09

需要筛选出仅包含球员**背靠背(连续两天)**的比赛数据,目标结果如下:

PlayerGame_date
Lebron James2023-10-11
Lebron James2023-10-12
Kobe Bryant2023-11-02
Kobe Bryant2023-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:51:12