在pandas数据框中查找子序列并将其与列的值匹配

时间:2018-07-10 13:14:40

标签: python-3.x pandas dataframe

我有兴趣了解是否:

  

包含一个字符串或数字序列,因为它在一个更大或更大的字符串或数字序列中。

以下是一个熊猫数据框,其中有两列:Id和Time。该数据框是按照时间值预先排序的。

import pandas as pd

label1 = ['422','422','422','428','428','453','453','453','453','453','421','421','421','421','421','422','422','422','424','424','424']
label2 = ['13:08','13:08','13:09','13:12','13:12','13:16','13:16','13:17','13:17','13:18','13:20','13:20','13:20','13:20','13:22', '13:23','13:24','13:24', '13:25','13:25','13:26']

d = {'Id':label1,'Time':label2}
df=pd.DataFrame(d)
df

输出df如下所示:

In [4]: df
Out[4]: 
     Id   Time
0   422  13:08
1   422  13:08
2   422  13:09
3   428  13:12
4   428  13:12
5   453  13:16
6   453  13:16
7   453  13:17
8   453  13:17
9   453  13:18
10  421  13:20
11  421  13:20
12  421  13:20
13  421  13:20
14  421  13:22
15  422  13:23
16  422  13:24
17  422  13:24
18  424  13:25
19  424  13:25
20  424  13:26

到目前为止我所做的。我试图生成一个较小的数据框,如下所示:

df["Id"] = df['Id'].astype('int')
bb1= df[df['Id'].diff(-1).ne(0)]
bb1

产生了以下输出:

In [59]: bb1
Out[59]: 
     Id   Time
2   422  13:09
4   428  13:12
9   453  13:18
14  421  13:22
17  422  13:24
20  424  13:26 

bb数据帧包含ID的出现顺序。它们以以下顺序出现:S1 = [422,428,453,421,422,424]。

此外,还有一个给定 子序列,它是S2 = [421,422,424],恰好包含在S1中。

我需要确定bb数据帧是否包含Ids的子序列,如S2 = [421、422、424]所示。如果确定了子序列,则应使用以下输出返回答案:

index Id Time

10 421 13:20 

14 421 13:22 

15 422 13:23 

17 422 13:24 

18 424 13:25 

20 424 13:26

所需的输出包含第一个和最后一个时间戳及其关联的索引。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

从您的bb1开始工作,关键是子序列匹配,我找到了solution here,并进行了少许修改以适合您的情况:

S2 = [421,422,424]
N = len(S2)
# Sub-sequence matching
sub = (bb1.Id.rolling(window=N)
             .apply(lambda x: (x == S2).all(), raw=True)
             .mask(lambda x: x == 0)
             .bfill(limit=N))
print(sub)
# Output
2     NaN
4     NaN
9     1.0
14    1.0
17    1.0
20    1.0
Name: Id, dtype: float64

# And for final results
sub = sub[sub.eq(1)]
beg = sub.index[0] + 1
end = sub.index[-1]
res = df.loc[beg:end].drop_duplicates(keep='first')
print(res)
# Output
     Id   Time
10  421  13:20
14  421  13:22
15  422  13:23
16  422  13:24
18  424  13:25
20  424  13:26