РЕДАКТИРОВАТЬ : Пересматривая этот вопрос через месяц, на самом деле есть гораздо более простой способ с groupby
и cumsum
: просто сгруппировать по Id
и взять cumsum
из Status
затем сбросьте значения, где cumsum
больше 0:
df[df.groupby('Id')['Status'].cumsum() < 1]
Лучший способ, который я нашел, - это найти индекс первой 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)
Выход:
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