Как извлечь данные из фрейма данных при изменении значения столбца - PullRequest
0 голосов
/ 23 марта 2020

Я хочу извлечь часть фрейма данных при изменении значения с 0 на 1.

logic1: при изменении значения с 0 на 1 начинайте сохранять данные, пока значение снова не изменится на 0. (также указывает до 1 и после 1)

logic2: при изменении значения с 0 на 1 начинайте сохранять данные, пока значение снова не изменится на 0. (не нужно сохранять точки до 1 и после 1)

сохранять данные только при первом изменении значения флага с 0 на 1, после этого при повторном изменении значения с 0 на 1 ничего делать не нужно

df=pd.DataFrame({'value':[3,4,7,8,11,1,15,20,15,16,87],'flag':[0,0,0,1,1,1,0,0,1,1,0]})

Desired output:
df_out_1=pd.DataFrame({'value':[7,8,11,1,15]})

Desired output:
df_out_2=pd.DataFrame({'value':[8,11,1]})

1 Ответ

1 голос
/ 23 марта 2020

Идея состоит в том, чтобы получить последовательные группы из 1 и 0 последовательных групп в s, отфильтровать только 1 группы и получить первую 1 группу путем сравнения по минимальному значению:

df = df.reset_index(drop=True)
s = df['flag'].ne(df['flag'].shift()).cumsum()
m = s.eq(s[df['flag'].eq(1)].min())

df2 = df.loc[m, ['value']]
print (df2)
   value
3      8
4     11
5      1

А затем отфильтруйте значения с помощью aff и удалите 1 по умолчанию RangeIndex:

df1 = df.loc[(df2.index + 1).union(df2.index - 1), ['value']]
print (df1)
   value
2      7
3      8
4     11
5      1
6     15
...