Как мне выполнить цикл по столбцу Pandas по отдельности и обнаружить изменения из другого столбца?

#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'])