У меня есть набор данных НБА, который выглядит так:
И я хочу отфильтровать его, чтобы он включал только последовательные игры, чтобы он выглядел так:
Пожалуйста, считайте, что это всего лишь фрагмент всего моего набора данных, поэтому мне, надеюсь, нужно будет найти способ отфильтровать весь набор данных, а не только этот небольшой фрагмент.
Если вы хотите создать фрейм данных:
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
Поскольку это НБА, в ней будет только две игры подряд. Так что ровно два!
Убедитесь, что записи игр отсортированы сначала по игроку, а затем по дате. Затем просмотрите игровые записи. Если в текущей записи игры указан тот же игрок, что и в следующей записи игры, а даты игр отличаются на один день, то вы нашли последовательные игры. В чем сложность?






# ensure datetime (NOT date!)
df['Game_date'] = pd.to_datetime(df['Game_date'])
# identify rows to keep
keep = (df.groupby('Player')['Game_date']
.transform(lambda g: (m:=g.diff().dt.days.eq(1)) | m.shift(-1))
)
# select
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
Промежуточные уровни (с двумя дополнительными свиданиями, чтобы продемонстрировать несколько последовательных свиданий для каждого игрока):
Player Game_date diff m m.shift(-1) m|m.shift(-1)
0 Lebron James 2023-10-11 NaT False True True
1 Lebron James 2023-10-12 1 days True False True
2 Lebron James 2023-10-18 6 days False NaN False
3 Kobe Bryant 2023-11-02 NaT False True True
4 Kobe Bryant 2023-11-03 1 days True False True
5 Kobe Bryant 2023-11-09 6 days False False False
6 Kobe Bryant 2023-12-11 32 days False True True
7 Kobe Bryant 2023-12-12 1 days True NaN True
Хотите найти две или более игры подряд? Или ровно два?