首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件连续序列的识别

条件连续序列的识别
EN

Stack Overflow用户
提问于 2022-08-31 18:46:17
回答 2查看 48关注 0票数 0

我有一张像这样的数据

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

df = pd.DataFrame({
    'column': [0,0,1,1,1,2,2,2,2,1,1,]
})

    column
0        0
1        0
2        1
3        1
4        1
5        2
6        2
7        2
8        2
9        1
10       1

我感兴趣的是识别与某些条件相匹配的所有连续序列(例如,索引数中没有跳变),后者是琐碎的。

代码语言:javascript
复制
df[df['column'] == 1]

    column
2        1
3        1
4        1
9        1
10       1

下一步是将索引2-4和9-10识别为两个离散实体。我可以(并且已经)使用这样的逻辑来创建一个常规python循环(不需要索引,只是提取序列本身的一种方法)

代码语言:javascript
复制
[(2,4), (9,10)]

但这似乎是不必要的,我想知道是否有人有一个更“熊猫”/有效的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-31 18:53:21

您可以使用:

代码语言:javascript
复制
# group by consecutive values
g = df['column'].ne(df['column'].shift()).cumsum()
# identify rows with "1"
m = df['column'].eq(1)

out = (df[m]
       .groupby(g, sort=False)
       .apply(lambda g: (g.index[0], g.index[-1]))
       .tolist()
      )

输出:[(2, 4), (9, 10)]

票数 1
EN

Stack Overflow用户

发布于 2022-08-31 19:10:43

确定目标群体,包括:

代码语言:javascript
复制
grp = df['column'].diff().ne(0).cumsum()

然后按这些进行分组,为每一组首先和最后一次索引。然后只选择组1并转换为列表:

代码语言:javascript
复制
df.groupby(['column',grp]).apply(lambda x: (x.index[0],x.index[-1])).xs(1).to_list()

结果

代码语言:javascript
复制
[(2, 4), (9, 10)]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73560576

复制
相关文章

相似问题

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