我的数据框看起来像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 回答
大话西游666
TA贡献1817条经验 获得超14个赞
国际大学联盟
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
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
你可以这样做:
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
有只小跳蛙
TA贡献1824条经验 获得超8个赞
反转您的行(这很重要)。然后调用groupbyand cumsum,并取(反向)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
添加回答
举报
0/150
提交
取消