当值连续 1 4 次时,如何在 pandas groupby 中保持分组

问题描述 投票:0回答:3

我想对我的数据框进行分组,并检查标志列的每列值是否在组中连续保持 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')
python-3.x pandas numpy pandas-groupby
3个回答
1
投票

可以在非零差上使用

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

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

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.