У меня есть следующий фрейм данных pandas
foo = pd.DataFrame({'step': [1,2,3,4,5,6,7,8], 'val': [1,1,1,0,0,1,0,1]})
Я хотел бы получить 1-й и последний step для каждой последовательности 1s в столбце val.
Объяснение:
Первая последовательность единиц происходит на шагах 1,2,3 -> первая step есть 1 последняя step есть 3
Вторая последовательность единиц происходит на шаге 6 -> первая step6 последняя step 6
Последняя последовательность единиц происходит на шаге 8 -> первая step равна 8 последняя step равна 8
Итак, на выходе — список [1,3,6,6,8,8]
Любые идеи, как это сделать?






IIUC, вы можете использовать агрегацию groupby, сгладить с помощью numpy и преобразовать в список:
# compute groups of consecutive numbers
group = foo['val'].ne(foo['val'].shift()).cumsum()
out = (foo
.loc[foo['val'].eq(1), 'step'] # keep step only where vale is 1
.groupby(group).agg(['first', 'last']) # get first and last
.to_numpy().ravel().tolist() # reshape
)
вывод: [1, 3, 6, 6, 8, 8]
не должен ли вывод быть
[1, 3, 6, 6, 8, 8]?