Pandas 中的三列分组数据框
Grouping dataframe wrt three columns in Pandas
我有一个数据集
Name Subset Type System
A00 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 A
B03 IT-09 OP A
D09 IT OP A
D09 IM LP A
D09 IM OP A
所以在这里我需要对名称列进行分组,使子集、系统和类型相似。
我们只需要考虑子集列的第一个字母部分而忽略其余部分。比如IM-09-B,IM03A可以认为是IM。
需要输出
Subset Cluster Type Cluster Name System
IU,IT OP,PP A00 A
IM,IM,IT LP, OP, OP B03, D09 A
IU,IT OP,PP B01 B
这里形成了第一个集群实例,因为在这两种情况下,IU 是 OP,IT 是 PP,第二个实例类似。
你可以做一个双重 groupby
,在第一轮中,你 groupby
“名称”将“子集”、“类型”和“系统”分组;然后再次按这些列对“名称”进行分组。
out = df.assign(Subset=df['Subset'].str[:2])\
.sort_values(by=df.columns.tolist())\
.groupby('Name', as_index=False)\
.agg(**{'Subset Cluster': ('Subset', ', '.join),
'Type Cluster': ('Type', ', '.join),
'System': ('System', 'first')})\
.groupby(['Subset Cluster', 'Type Cluster', 'System'], as_index=False)\
.agg(', '.join)
输出:
Subset Cluster Type Cluster System Name
0 IM, IM, IT LP, OP, OP A B03, D09
1 IT, IU PP, OP A A00
2 IT, IU PP, OP B B01
我有一个数据集
Name Subset Type System
A00 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 A
B03 IT-09 OP A
D09 IT OP A
D09 IM LP A
D09 IM OP A
所以在这里我需要对名称列进行分组,使子集、系统和类型相似。 我们只需要考虑子集列的第一个字母部分而忽略其余部分。比如IM-09-B,IM03A可以认为是IM。
需要输出
Subset Cluster Type Cluster Name System
IU,IT OP,PP A00 A
IM,IM,IT LP, OP, OP B03, D09 A
IU,IT OP,PP B01 B
这里形成了第一个集群实例,因为在这两种情况下,IU 是 OP,IT 是 PP,第二个实例类似。
你可以做一个双重 groupby
,在第一轮中,你 groupby
“名称”将“子集”、“类型”和“系统”分组;然后再次按这些列对“名称”进行分组。
out = df.assign(Subset=df['Subset'].str[:2])\
.sort_values(by=df.columns.tolist())\
.groupby('Name', as_index=False)\
.agg(**{'Subset Cluster': ('Subset', ', '.join),
'Type Cluster': ('Type', ', '.join),
'System': ('System', 'first')})\
.groupby(['Subset Cluster', 'Type Cluster', 'System'], as_index=False)\
.agg(', '.join)
输出:
Subset Cluster Type Cluster System Name
0 IM, IM, IT LP, OP, OP A B03, D09
1 IT, IU PP, OP A A00
2 IT, IU PP, OP B B01