识别连续出现的值

Ste*_*ter 12 python python-itertools dataframe pandas

我有一个这样的df:

Count
1
0
1
1
0
0
1
1
1
0
Run Code Online (Sandbox Code Playgroud)

我想返回1一个新列,如果有两个或多个连续出现1Count0如果没有.因此,在新列中,每行将1根据列中满足的此条件获得Count.那么我想要的输出是:

Count  New_Value
1      0 
0      0
1      1
1      1
0      0
0      0
1      1
1      1 
1      1
0      0
Run Code Online (Sandbox Code Playgroud)

我想我可能需要使用,itertools但我一直在阅读它,并没有遇到我需要的东西.我希望能够使用此方法计算任意数量的连续出现次数,而不仅仅是2次.例如,有时我需要连续计算10次,我在这里只使用2.

Ste*_*fan 11

你可以:

df['consecutive'] = df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count
Run Code Online (Sandbox Code Playgroud)

要得到:

   Count  consecutive
0      1            1
1      0            0
2      1            2
3      1            2
4      0            0
5      0            0
6      1            3
7      1            3
8      1            3
9      0            0
Run Code Online (Sandbox Code Playgroud)

从这里你可以,任何门槛:

threshold = 2
df['consecutive'] = (df.consecutive > threshold).astype(int)
Run Code Online (Sandbox Code Playgroud)

要得到:

   Count  consecutive
0      1            0
1      0            0
2      1            1
3      1            1
4      0            0
5      0            0
6      1            1
7      1            1
8      1            1
9      0            0
Run Code Online (Sandbox Code Playgroud)

或者,只需一步:

(df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count >= threshold).astype(int)
Run Code Online (Sandbox Code Playgroud)

在效率方面,pandas当问题的大小增加时,使用方法可以提供显着的加速:

 df = pd.concat([df for _ in range(1000)])

%timeit (df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count >= threshold).astype(int)
1000 loops, best of 3: 1.47 ms per loop
Run Code Online (Sandbox Code Playgroud)

相比:

%%timeit
l = []
for k, g in groupby(df.Count):
    size = sum(1 for _ in g)
    if k == 1 and size >= 2:
        l = l + [1]*size
    else:
        l = l + [0]*size    
pd.Series(l)

10 loops, best of 3: 76.7 ms per loop
Run Code Online (Sandbox Code Playgroud)

  • 这是一个单行:`df.assign(consecutive=df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size')).query( 'consecutive > @threshold')` 适用于任何连续的值(不仅是 1 和 0) (2认同)