Python 3.x 如何在列值发生变化时从数据框中提取数据
我想在值从0变为1时提取数据帧的一部分 逻辑1:当值从0变为1时,开始保存数据,直到值再次变为0。(也包括1之前和1之后的点) 逻辑2:当值从0变为1时,开始保存数据,直到值再次变为0。(不需要在1之前和1之后保存点数) 仅当标志的第一次值从0更改为1时保存数据,在此之后,如果值再次从0更改为1,则无需执行任何操作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
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的行,这不是我的要求