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

时间:2019-01-06 23:35:12

标签: python pandas numpy

您好,我正在尝试找出一种方法,该方法可以找到最长的公共连续子序列(在这种情况下是时间间隔),而不会从一组序列中丢失任何(Nan)值。这是一个示例数据框。

   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。真实的数据框更大,包含更多的序列。是否有可能找到解决此问题的有效方法?

非常感谢您。

2 个答案:

答案 0 :(得分:1)

我通过一些设置来更新此示例:

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,但末尾有一个附加条目,因此将有两个具有连续索引的区域。

我认为,从这里开始,最好的方法是删除所有缺少数据的行,然后计算剩余索引中的最长序列。这样的事情应该可以解决问题:

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])

哪个会给你:

   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 :(得分:0)

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

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