#python #pandas #data-science
#python #pandas #наука о данных
Вопрос:
Я в растерянности, не уверен, что делать, я надеюсь, что кто-нибудь сможет помочь.
У меня есть набор данных с идентификатором пользователя, воспроизведенным видом спорта и датой. Мне нужно перебирать каждого человека (PersonID) и возвращать ТОЛЬКО тех, кто играл в баскетбол, а затем играл в футбол. В приведенном ниже примере будут возвращены только PersonID 1 и PersonID 3. PersonID 4 играл в футбол, но они не будут возвращены, поскольку раньше они играли в футбол, а не в баскетбол.
Есть идеи, как подойти к этому? Спасибо!
personID sportPlayed date
1 Basketball 2020-01-01
1 Basketball 2020-01-02
1 Football 2020-03-01
2 Baseball 2020-02-05
2 Baseball 2020-03-05
3 Basketball 2020-04-01
3 Football 2020-05-05
4 Soccer 2020-02-01
4 Football 2020-02-06
Комментарии:
1. Важен ли порядок? Вы хотите совпадение, если человек играл в футбол, а затем в баскетбол?
2. @AbhimanyuShekhawat Да, порядок важен. Сначала они должны играть в баскетбол, а затем в футбол.
3. И они не могут заниматься каким-либо видом спорта между ними?
Ответ №1:
Найдите самую раннюю дату, когда кто-то играл в баскетбол, затем проверьте, предшествует ли это последней дате, когда они играли в футбол. Затем отфильтруйте серию и получите индекс.
Кто-то, у кого нет ни того, ни другого, не будет отображаться в выходных данных, но поскольку вы заботитесь только об игроках, для которых это True
, все в порядке.
s = (df[df['sportPlayed'].eq('Basketball')].groupby('personID').date.min()
.lt(df[df['sportPlayed'].eq('Football')].groupby('personID').date.max()))
#personID
#1 True
#3 True
#4 False
#Name: date, dtype: bool
s[s].index
#Int64Index([1, 3], dtype='int64', name='personID')
Комментарии:
1. Спасибо за ответ! Допустим, теоретически кто-то играл в баскетбол, футбол, тогда Soccer…so Футбол посередине. Будет ли этот запрос по-прежнему возвращать его?
2. @G.Nguyen Да, так и будет, он просто проверяет, есть ли баскетбол где-нибудь перед последним футболом. Если они должны быть последовательными (например, баскетбол, футбол, футбол не в счет), дайте мне знать.
3. Спасибо! Я думаю, что это работает, за исключением того, что я не учел условие, которое я вижу в своем наборе данных. Есть один пользователь, который выполнил этот порядок: Баскетбол, Футбол, Basketball. Этот человек должен соответствовать требованиям, поскольку он играл в баскетбол, затем в футбол, но этот запрос не отвечает на него. Есть предложения? Еще раз спасибо!
4. @G.Nguyen Это все равно должно работать, потому что для этого потребуется первая дата баскетбола и последняя дата футбола, поэтому они все равно будут сравниваться должным образом. Ваши даты
datetime
? попробуйтеdf['date'] = pd.to_datetime(df['date'])