我的数据框看起来像
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)]
,到目前为止一切正常。我只是想知道是否还有其他方法可以实现这一目标?
答案 0 :(得分:4)
反转行(这很重要)。然后调用groupby
和cumsum
,并获取(求和的)求和值等于零的所有行。
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
答案 1 :(得分:2)
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
答案 2 :(得分:2)
您可以这样做:
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