你好,我正在尝试找出一种方法,它可以从一组序列中找到最长的公共连续子序列(在本例中是时间间隔),并且没有任何缺失(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。真正的数据帧要大得多,并且包含更多的序列。有没有可能找到这个问题的有效解决方案?
非常感谢。
发布于 2019-01-07 07:47:17
首先使用dropna,然后我们使用cumsum和diff建立一个键来区分不同的组是否继续(相差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发布于 2019-01-07 08:07:16
我为一个工作示例更新了一些设置:
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.0https://stackoverflow.com/questions/54066898
复制相似问题