将ID的行拖放到Pandas中的特定列值之后

tst*_*eby 5 python group-by pandas

我有一个像这样的数据集:

Id   Status

1     0
1     0
1     0
1     0
1     1
2     0
1     0
2     0
3     0
3     0
Run Code Online (Sandbox Code Playgroud)

我想在ID的状态变为1后删除ID的所有行,即我的新数据集将是:

Id   Status

1     0
1     0
1     0
1     0
1     1
2     0
2     0
3     0
3     0

i.e.

1     0   --> gets removed since this row appears after id 1 already had a status of 1
Run Code Online (Sandbox Code Playgroud)

由于我有非常大的数据集(超过200 GB),因此如何有效地实现它。

谢谢你的帮助。

gmd*_*mds 2

编辑:一个月后重新审视这个问题,实际上有一种更简单的方法使用groupbyand cumsum:只需分组并Idcumsumof ,然后删除大于 0 的Status值:cumsum

df[df.groupby('Id')['Status'].cumsum() < 1]
Run Code Online (Sandbox Code Playgroud)

我发现的最好方法是找到第一个 1 的索引并以这种方式对每个组进行切片。如果不存在 1,则返回该组不变:

def remove(series):
    indexless = series.reset_index(drop=True)
    ones = indexless[indexless['Status'] == 1]
    if len(ones) > 0:
        return indexless.iloc[:ones.index[0] + 1]

    else:
        return indexless

df.groupby('Id').apply(remove).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

输出:

   Id  Status
0   1       0
1   1       0
2   1       0
3   1       0
4   1       1
5   2       0
6   2       0
7   3       0
8   3       0
Run Code Online (Sandbox Code Playgroud)