使用 Pandas 进行数据分组
Data Grouping with 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 B
D09 IM OP A
上面的dataframe,我需要根据使用extractall(r'[^a-zA-Z]*([a-zA-Z]+)[^,]*').groupby(level=0).agg(', '.join)
提取的Grouping Name和Subset字符串进行转换。而Systems, Subsets应该按照Types依次提及。
输出示例:
Subset Cluster Type Cluster Name System Subsets
IU,IT OP,PP A00,B01 A,A,B,B IU00-A,IT00
IM,IM,IT LP, OP, OP B03, D09 A,A,A,A,B,A IM-09-B,IM03A,IT-09,IT,IM,IM
从您的数据框开始,为了获得您的结果,我将使用两个聚合操作,因为您需要进行两个分组,相对于 Name
和 Subset Cluster
。这是我的做法:
df.rename(columns={'Subset': 'Subset Cluster'}, inplace=True)
df['Subsets'] = df['Subset Cluster'].apply(lambda s: s[:2])
df = df.groupby('Name').agg(lambda col: ', '.join(sorted(list(col))) ).reset_index()
df = df.groupby('Subsets').agg(lambda col: ', '.join(sorted(list(col))) ).reset_index()
df
双 groupby
我们首先按“名称”分组,然后再按“子集集群”和“类型集群”进行分组:
out = df.assign(**{'Subset Cluster': df['Subset'].str.extractall(r'[^a-zA-Z]*([a-zA-Z]+)[^,]*')\
.groupby(level=0)[0].agg(', '.join)})\
.sort_values(by=df.columns.tolist())\
.groupby('Name', as_index=False).agg(', '.join).rename(columns={'Type':'Type Cluster'})\
.groupby(['Subset Cluster', 'Type Cluster'], as_index=False).agg(', '.join)
输出:
Subset Cluster Type Cluster Name Subset System
0 IM, IM, IT LP, OP, OP B03, D09 IM-09-B, IM03A, IT-09, IM, IM, IT A, A, A, B, A, A
1 IT, IU PP, OP A00, B01 IT00, IU00-A, IT-01A, IU A, A, B, B
我有一个数据框
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 B
D09 IM OP A
上面的dataframe,我需要根据使用extractall(r'[^a-zA-Z]*([a-zA-Z]+)[^,]*').groupby(level=0).agg(', '.join)
提取的Grouping Name和Subset字符串进行转换。而Systems, Subsets应该按照Types依次提及。
输出示例:
Subset Cluster Type Cluster Name System Subsets
IU,IT OP,PP A00,B01 A,A,B,B IU00-A,IT00
IM,IM,IT LP, OP, OP B03, D09 A,A,A,A,B,A IM-09-B,IM03A,IT-09,IT,IM,IM
从您的数据框开始,为了获得您的结果,我将使用两个聚合操作,因为您需要进行两个分组,相对于 Name
和 Subset Cluster
。这是我的做法:
df.rename(columns={'Subset': 'Subset Cluster'}, inplace=True)
df['Subsets'] = df['Subset Cluster'].apply(lambda s: s[:2])
df = df.groupby('Name').agg(lambda col: ', '.join(sorted(list(col))) ).reset_index()
df = df.groupby('Subsets').agg(lambda col: ', '.join(sorted(list(col))) ).reset_index()
df
双 groupby
我们首先按“名称”分组,然后再按“子集集群”和“类型集群”进行分组:
out = df.assign(**{'Subset Cluster': df['Subset'].str.extractall(r'[^a-zA-Z]*([a-zA-Z]+)[^,]*')\
.groupby(level=0)[0].agg(', '.join)})\
.sort_values(by=df.columns.tolist())\
.groupby('Name', as_index=False).agg(', '.join).rename(columns={'Type':'Type Cluster'})\
.groupby(['Subset Cluster', 'Type Cluster'], as_index=False).agg(', '.join)
输出:
Subset Cluster Type Cluster Name Subset System
0 IM, IM, IT LP, OP, OP B03, D09 IM-09-B, IM03A, IT-09, IM, IM, IT A, A, A, B, A, A
1 IT, IU PP, OP A00, B01 IT00, IU00-A, IT-01A, IU A, A, B, B