首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标识pandas DataFrame列中的值的连续出现

问标识pandas DataFrame列中的值的连续出现
EN

Stack Overflow用户
提问于 2016-06-21 09:56:07
回答 2查看 9.8K关注 0票数 13

我有一个这样的df:

代码语言:javascript
复制
Count
1
0
1
1
0
0
1
1
1
0

如果1在Count中连续出现两次或两次以上,我希望在新列中返回一个1,如果没有,则返回一个0。因此,在新的列中,根据列Count中满足的条件,每一行都将获得一个1。我想要的输出结果是:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-21 10:39:32

您可以:

代码语言:javascript
复制
df['consecutive'] = df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count

要获得以下信息:

代码语言:javascript
复制
   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

在这里,您可以对任何阈值执行以下操作:

代码语言:javascript
复制
threshold = 2
df['consecutive'] = (df.consecutive > threshold).astype(int)

要获得以下信息:

代码语言:javascript
复制
   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

或者,在一个步骤中:

代码语言:javascript
复制
(df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count >= threshold).astype(int)

在效率方面,当问题的规模增长时,使用pandas方法可以显著加快速度:

代码语言:javascript
复制
 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

对比:

代码语言:javascript
复制
%%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
票数 13
EN

Stack Overflow用户

发布于 2016-06-21 10:32:13

不确定这是否经过优化,但你可以试一试:

代码语言:javascript
复制
from itertools import groupby
import pandas as pd

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

df['new_Value'] = pd.Series(l)

df

Count   new_Value
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37934399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档