您好,我正在尝试找出一种方法,该方法可以找到最长的公共连续子序列(在这种情况下是时间间隔),而不会从一组序列中丢失任何(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。真实的数据框更大,包含更多的序列。是否有可能找到解决此问题的有效方法?
非常感谢您。
答案 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
首先,然后我们将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