我想对我的数据框进行分组,并检查标志列的每列值是否在组中连续保持 1 等于或大于 2 行,然后如果组计数小于连续 1 从数据框删除,则保留该组
dataframe1=pd.DataFrame({'x1':[5,678,78,89,4,5,6,5],'x2':[555,555,555,555,3,3,3,3],'flag':[1,1,0,0,1,0,0,0]})
df_out=dataframe1=pd.DataFrame({'x1':[5,678],'x2':[555,555],'flag':[1,1]})
i can use groupby :
df_out=dataframe1.groupby(by='x2')
可以在非零差上使用
cumsum()
来识别标志块:
blocks = dataframe1.flag.diff().ne(0).cumsum()
sizes = blocks.groupby([dataframe1['X2'],blocks]).transform('size')
dataframe1[dataframe1['flag'].eq(1) & sizes.ge(2)]
输出:
x1 x2 flag
0 5 555 1
1 678 555 1
找出每组中标志的连续差异。如果为 NaN,则将其设为零。求和,如果等于或小于 2,则拾取它。
s=dataframe1[dataframe1['flag'].eq(1)]#Filter 1s
s[s.groupby('x2')['flag'].transform(lambda x: (x.diff().fillna(0).eq(0).sum())).ge(2)]#Filter the consecutive as stated
x1 x2 flag
0 5 555 1
1 678 555 1
def function1(dd: pd.DataFrame):
if len(dd) > 1 and dd.flag.eq(1).all():
return dd
col1 = dataframe1.flag.ne(dataframe1.flag.shift()).cumsum()
dataframe1.groupby(col1,group_keys=False).apply(function1)
输出:
x1 x2 flag
0 5 555 1
1 678 555 1