我的數據框看起來像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,并?。ǚ聪颍ヽumsum 值等于零的所有行。
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
提交
取消