我有兴趣了解是否:
包含一个字符串或数字序列,因为它在一个更大或更大的字符串或数字序列中。
以下是一个熊猫数据框,其中有两列: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
所需的输出包含第一个和最后一个时间戳及其关联的索引。
非常感谢您的帮助。
答案 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