我有一个数据框,您可以在下面看到它的状态。名为target
的列是我想要的列:
group value target
1 1 0
1 2 0
1 3 2
1 4 0
1 5 1
2 1 0
2 2 0
2 3 0
2 4 1
2 5 3
现在,我想在每个组的target
列中找到第一个非零值,并删除每个组中该行之前的行。所以输出应该是这样的:
group value target
1 3 2
1 4 0
1 5 1
2 4 1
2 5 3
我见过this post,但是我不知道如何更改代码来获得想要的结果。
我该怎么办?
答案 0 :(得分:2)
在分组方式中,将sort
设置为False
,获取cumsum
,然后过滤不等于0
的行:
df.loc[df.groupby(["group"], sort=False).target.cumsum() != 0]
group value target
2 1 3 2
3 1 4 0
4 1 5 1
8 2 4 1
9 2 5 3
答案 1 :(得分:1)
这应该做。我敢肯定,您可以用更少的reset_index()
来做到这一点,但是如果您的数据帧不太大,那么这不会对速度产生太大影响:
idx = dff[dff.target.ne(0)].reset_index().groupby('group').index.first()
mask = (dff.reset_index().set_index('group')['index'].ge(idx.to_frame()['index'])).values
df_final = dff[mask]
0 group value target
3 1 3 2
4 1 4 0
5 1 5 1
9 2 4 1
10 2 5 3