使用Python进行序列模式挖掘

问题描述 投票:0回答:1

我有一个数据集

Name    Subset    Type    System
A00     9-IU00-A  OP      A
A00     IT00      PP      A
B01     IT-01A    PP      B
B01     IU        OP      B
B03     IM-09-B   LP      A
B03     IM03A     OP      B
B03     IT-09     OP      A
D09     IT-A09    OP      B
D09     07IM-09A  LP      B
D09     IM        OP      A

所以这里我需要对“名称”列进行分组,使“子集”和“类型”相似。 我们必须只考虑子集列的第一个字母部分并忽略其余部分。例如IM-09-B、IM03A可以被认为是IM。

Subset
簇是第一个字母字符串,其中包含任何数字、连字符等,使用

提取
df['Subset'].str.extractall(r'[^a-zA-Z]*([a-zA-Z]+)[^,]*').groupby(level=0)[0].agg(','.join)})

需要输出

Subset Cluster    Type Cluster    Name        System
IU,IT             OP,PP           A00,B01     A,A,B,B
IM,IM,IT          LP, OP, OP      B03, D09    A,B,A,B,B,A

这里形成了第一个集群实例,因为在这两种情况下,IU 是 OP,IT 是 PP,第二个实例类似。 这里如何使用顺序模式挖掘。

python python-3.x pandas dataframe group-by
1个回答
1
投票

我们可以首先

sort_values
,然后使用链式
groupby
,一次按名称聚合,然后再次按子集和类型集群:

out = (df.assign(Subset=df['Subset'].str.extractall(r'[^a-zA-Z]*([a-zA-Z]+)[^,]*')
                 .groupby(level=0)[0].agg(','.join))
       .sort_values(df.columns.tolist())
       .groupby('Name').agg(','.join).add_suffix(' Cluster')
       .reset_index()
       .groupby(['Subset Cluster', 'Type Cluster'], as_index=False).agg(','.join)
      )

输出:

  Subset Cluster Type Cluster     Name System Cluster
0       IM,IM,IT     LP,OP,OP  B03,D09    A,B,A,B,A,B
1          IT,IU        PP,OP  A00,B01        A,A,B,B
© www.soinside.com 2019 - 2024. All rights reserved.