Python 3.x 如何在列值发生变化时从数据框中提取数据

Python 3.x 如何在列值发生变化时从数据框中提取数据,python-3.x,pandas,numpy,pandas-groupby,Python 3.x,Pandas,Numpy,Pandas Groupby,我想在值从0变为1时提取数据帧的一部分 逻辑1:当值从0变为1时,开始保存数据,直到值再次变为0。(也包括1之前和1之后的点) 逻辑2:当值从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]}) De

我想在值从0变为1时提取数据帧的一部分

逻辑1:当值从0变为1时,开始保存数据,直到值再次变为0。(也包括1之前和1之后的点)

逻辑2:当值从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
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

你能详细说明一下逻辑吗?那么,这种变化的触发因素是什么?您可以使用
df[df['flag']==1]
并将其保存到每个触发器中所需的变量中。@dzakyputra您所说的是简单过滤器,这样我将获得带有标志1的行,这不是我的要求