首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在序列集合中查找没有NaN值的最长子序列

在序列集合中查找没有NaN值的最长子序列
EN

Stack Overflow用户
提问于 2019-01-07 07:35:12
回答 2查看 428关注 0票数 1

你好,我正在尝试找出一种方法,它可以从一组序列中找到最长的公共连续子序列(在本例中是时间间隔),并且没有任何缺失(Nan)值。这是一个数据帧示例。

代码语言:javascript
运行
复制
   time  s_1  s_2  s_3
0  1     2    2    Nan
1  2     3    Nan  Nan
2  3     3    2    2
3  4     5    3    10
4  5     8    4    3
5  6     Nan  Nan  7
6  7     5    2    Nan
7  8     Nan  3    Nan

对于这个小例子,“最佳”时间间隔应该是3-5或索引2-4。真正的数据帧要大得多,并且包含更多的序列。有没有可能找到这个问题的有效解决方案?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-07 07:47:17

首先使用dropna,然后我们使用cumsumdiff建立一个键来区分不同的组是否继续(相差1)

代码语言:javascript
运行
复制
s=df.dropna()
idx=s.time.groupby(s.time.diff().ne(1).cumsum()).transform('count')
idx
0    1
2    3
3    3
4    3
Name: time, dtype: int64
yourmax=s[idx==idx.max()]
yourmax
   time  s_1  s_2   s_3
2     3  3.0  2.0   2.0
3     4  5.0  3.0  10.0
4     5  8.0  4.0   3.0
票数 0
EN

Stack Overflow用户

发布于 2019-01-07 08:07:16

我为一个工作示例更新了一些设置:

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

s1 = [2,3,3,5,8,np.NAN,5,np.NAN,1]
s2 = [2,np.NAN,2,3,4,np.NAN,2,3,1]
s3 = [np.NAN,np.NAN,2,10,3,7,np.NAN,np.NAN,1]
data = {'time':np.arange(1,9+1),'s_1':s1,'s_2':s2,'s_3':s3}

df =  pd.DataFrame(data)
print(df)

这将创建一个您在上面发布的DataFrame,但在末尾有一个额外的条目,因此将有两个带有连续索引的区域。

我认为最好的方法是删除所有缺少数据的行,然后对剩余索引中最长的序列进行计数。下面这样的代码应该能起到作用:

代码语言:javascript
运行
复制
sequence = np.array(df.dropna(how='any').index)    
longest_seq = max(np.split(sequence, np.where(np.diff(sequence) != 1)[0]+1), key=len)    
print(df.iloc[longest_seq])

这将为您提供:

代码语言:javascript
运行
复制
   time  s_1  s_2   s_3
2     3  3.0  2.0   2.0
3     4  5.0  3.0  10.0
4     5  8.0  4.0   3.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54066898

复制
相关文章

相似问题

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