当值从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
和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