在熊猫组中查找第一个非零元素

时间:2020-08-03 20:30:21

标签: python pandas dataframe

我有一个数据框,您可以在下面看到它的状态。名为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,但是我不知道如何更改代码来获得想要的结果。
我该怎么办?

2 个答案:

答案 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