识别值的连续出现 [英] Identifying consecutive occurrences of a value
问题描述
我有这样的df:
Count
1
0
1
1
0
0
1
1
1
0
,并且如果在Count
中连续出现两次或多次1
,并且在没有0
的情况下,我想在新列中返回1
.因此,在新列中,根据Count
列中满足的条件,每一行都将得到1
.我想要的输出将是:
and I want to return a 1
in a new column if there are two or more consecutive occurrences of 1
in Count
and a 0
if there is not. So in the new column each row would get a 1
based on this criteria being met in the column Count
. My desired output would then be:
Count New_Value
1 0
0 0
1 1
1 1
0 0
0 0
1 1
1 1
1 1
0 0
我认为我可能需要使用itertools
,但是我一直在阅读有关它,但是还没有遇到我需要的内容.我希望能够使用此方法来计数任意数量的连续出现,而不仅仅是2.例如,有时候我需要计算10次连续出现,在这里的示例中我只使用2次.
I am thinking I may need to use itertools
but I have been reading about it and haven't come across what I need yet. I would like to be able to use this method to count any number of consecutive occurrences, not just 2 as well. For example, sometimes I need to count 10 consecutive occurrences, I just use 2 in the example here.
推荐答案
您可以:
df['consecutive'] = df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count
获取:
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
在这里,您可以设置任何阈值:
From here you can, for any threshold:
threshold = 2
df['consecutive'] = (df.consecutive > threshold).astype(int)
获得:
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
或者,只需一步:
(df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count >= threshold).astype(int)
在效率方面,使用pandas
方法可以在问题规模扩大时显着提高速度:
In terms of efficiency, using pandas
methods provides a significant speedup when the size of the problem grows:
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
相比:
%%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
这篇关于识别值的连续出现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!