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),因此如何有效地实现它。
谢谢你的帮助。
编辑:一个月后重新审视这个问题,实际上有一种更简单的方法使用groupbyand cumsum:只需分组并Id取cumsumof ,然后删除大于 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)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |