我有一个数据框,您可以在下面看到它的情况。命名的列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我看过这篇文章,但我不知道如何更改代码以获得我想要的结果。我怎样才能做到这一点?
2 回答
长风秋雁
TA贡献1757条经验 获得超7个赞
在 groupby 中,设置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
MMMHUHU
TA贡献1834条经验 获得超8个赞
这个应该做 我相信你可以用 less 做到这一点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
添加回答
举报
0/150
提交
取消