我有一个数据集
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,第二个实例类似。 这里如何使用顺序模式挖掘。
我们可以首先
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