gpt4 book ai didi

python - 寻找有条件的顺序模式

转载 作者:太空狗 更新时间:2023-10-29 21:09:13 24 4
gpt4 key购买 nike

我有一个df as

  Id  Event SeqNo
1 A 1
1 B 2
1 C 3
1 ABD 4
1 A 5
1 C 6
1 A 7
1 CDE 8
1 D 9
1 B 10
1 ABD 11
1 D 12
1 B 13
1 CDE 14
1 A 15

我正在寻找一种模式“ABD 后跟 CDE,中间没有事件 B”例如,此 df 的输出将是:

 Id  Event SeqNo
1 ABD 4
1 A 5
1 C 6
1 A 7
1 CDE 8

单个 ID 可以多次遵循此模式,我想找到所有这些 ID 的列表及其各自的计数(如果可能)。

最佳答案

这是一个矢量化的,带有一些缩放技巧并利用卷积来找到所需的模式 -

# Get the col in context and scale it to the three strings to form an ID array
a = df['Event']
id_ar = (a=='ABD') + 2*(a=='B') + 3*(a=='CDE')

# Mask of those specific strings and hence extract the corresponding masked df
mask = id_ar>0
df1 = df[mask]

# Get pattern col with 1s at places with the pattern found, 0s elsewhere
df1['Pattern'] = (np.convolve(id_ar[mask],[9,1],'same')==28).astype(int)

# Groupby Id col and sum the pattern col for final output
out = df1.groupby(['Id'])['Pattern'].sum()

那个卷积部分可能有点棘手。这里的想法是使用 id_ar,它的值分别为 123 对应于字符串 'ABD'、''B''CDE'。我们正在寻找 1 后跟 3,因此使用内核 [9,1] 的卷积将导致 1* 1 + 3*9 = 28 作为具有 'ABD' 然后是 'CDE' 的窗口的卷积和。因此,我们寻找转换。 28 的总和。对于 'ABD' 后跟 ''B''CDE' 的情况,转换。总和会有所不同,因此会被过滤掉。

sample 运行-

1) 输入数据框:

In [377]: df
Out[377]:
Id Event SeqNo
0 1 A 1
1 1 B 2
2 1 C 3
3 1 ABD 4
4 1 B 5
5 1 C 6
6 1 A 7
7 1 CDE 8
8 1 D 9
9 1 B 10
10 1 ABD 11
11 1 D 12
12 1 B 13
13 2 A 1
14 2 B 2
15 2 C 3
16 2 ABD 4
17 2 A 5
18 2 C 6
19 2 A 7
20 2 CDE 8
21 2 D 9
22 2 B 10
23 2 ABD 11
24 2 D 12
25 2 B 13
26 2 CDE 14
27 2 A 15

2) 中间过滤 o/p(查看 Pattern 列以了解是否存在 reqd。pattern):

In [380]: df1
Out[380]:
Id Event SeqNo Pattern
1 1 B 2 0
3 1 ABD 4 0
4 1 B 5 0
7 1 CDE 8 0
9 1 B 10 0
10 1 ABD 11 0
12 1 B 13 0
14 2 B 2 0
16 2 ABD 4 0
20 2 CDE 8 1
22 2 B 10 0
23 2 ABD 11 0
25 2 B 13 0
26 2 CDE 14 0

3) 最终 o/p :

In [381]: out
Out[381]:
Id
1 0
2 1
Name: Pattern, dtype: int64

关于python - 寻找有条件的顺序模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54558981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com