Получить все строки после последнего появления определенного значения в пандах - PullRequest
0 голосов
/ 14 февраля 2019

Мой фрейм данных выглядит как

ID  colA  
1      B     
1      D     
2      B    
2      D     
2      C     

Я вернул все строки после последнего появления события B в каждой группе.Вывод будет:

ID  colA   
1      D   
2      D     
2      C  

Я пробовал

a = df['colA'].str.contains('B').groupby(df['ID'])
b = df[(a.transform('sum') - a.cumsum()).eq(0)]

, и пока он работает нормально.Мне просто интересно, есть ли альтернативный подход для достижения этой цели?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы можете сделать:

ix = (df.colA.eq('B')
        .cumsum()
        .groupby(df.ID)
        .apply(lambda x: x.loc[x.idxmax()+1:]).index.get_level_values(1))

df.loc[ix,:]

    ID colA
1   1    D
3   2    D
4   2    C
0 голосов
/ 14 февраля 2019

Поменяйте местами ряды (это важно).Затем вызовите groupby и cumsum и возьмите все строки с обратным значением (0).

df[df.colA.eq('B')[::-1].astype(int).groupby(df.ID).cumsum().eq(0)]

   ID colA
1   1    D
3   2    D
4   2    C
0 голосов
/ 14 февраля 2019

IIUC

def yourlast(x):
        return x.loc[x.colA.where(df.colA.eq('B')).last_valid_index()+1:]
df.groupby('ID').apply(yourlast)
Out[163]: 
      ID colA
ID           
1  1   1    D
2  3   2    D
   4   2    C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...