我有一个 NBA 数据集,如下所示:
玩家 | 比赛日期 |
---|---|
勒布朗·詹姆斯 | 2023-10-11 |
勒布朗·詹姆斯 | 2023-10-12 |
勒布朗·詹姆斯 | 2023-10-18 |
科比·布莱恩特 | 2023-11-02 |
科比·布莱恩特 | 2023-11-03 |
科比·布莱恩特 | 2023-11-09 |
我想过滤它,使其只包含背靠背的比赛,这样它看起来像这样:
玩家 | 比赛日期 |
---|---|
勒布朗·詹姆斯 | 2023-10-11 |
勒布朗·詹姆斯 | 2023-10-12 |
科比·布莱恩特 | 2023-11-02 |
科比·布莱恩特 | 2023-11-03 |
请将此视为我的整个数据集的一个片段,因此我希望找到一种方法来过滤整个数据集,而不是仅过滤这个小片段。
如果你想创建数据框:
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
groupby.transform
和 diff
检查日期是否连续,然后 shift
将掩码向后移动一步以包含起始行:
df['Game_date'] = pd.to_datetime(df['Game_date'])
keep = (df.groupby('Player')['Game_date']
.transform(lambda g: (m:=g.diff().dt.days.eq(1)) | m.shift(-1))
)
out = df.loc[keep]
输出:
Player Game_date
0 Lebron James 2023-10-11
1 Lebron James 2023-10-12
3 Kobe Bryant 2023-11-02
4 Kobe Bryant 2023-11-03