我有一个数据集
Name System
A AZ
A NaN
B AZ
B NaN
B NaN
C AY
C AY
D AZ
E AY
E AY
E NaN
F AZ
F AZ
F NaN
使用该数据集,我基于";系统";对于特定的";名称";。
在上面的例子中,名称A、B和D具有一个"0";AZ"子集";而C、E具有两个";AY";子集和F有两个AZ,所以它是一个不同的簇。聚类形式如下;
Cluster Names
AZ A,B
AY,AY C,E
AZ,AZ F
用于生成集群的代码:
df1 = (df.dropna(subset=['System'])
.groupby('Name')['System']
.agg(','.join)
.reset_index()
.groupby('System')['Name']
.agg(','.join)
.rename_axis('Cluster')
.reset_index())
基于这个集群输出,我需要不同集群的不同数据帧:我该怎么做?
输出示例-
数据帧1-
Name System
A AZ
A NaN
B AZ
B NaN
B NaN
数据帧2
Name System
C AY
C AY
E AY
E AY
E NaN
数据帧3
Name System
F AZ
F AZ
F NaN
您可以修改我以前的答案:
获取集群
clusters = (df.groupby(['Name', 'System'])
['System'].agg(Cluster=lambda x: (x.iloc[0], len(x)))
.droplevel('System').reset_index()
.groupby('Cluster')['Name'].agg(frozenset)
.reset_index()
)
# Cluster Name
# 0 (AY, 2) (C, E)
# 1 (AZ, 1) (A, B, D)
# 2 (AZ, 2) (F)
按分组
groups = df['Name'].map(clusters.explode('Name').set_index('Name')['Cluster'])
for _,d in df.groupby(groups):
print(d)
# Name System
# 5 C AY
# 6 C AY
# 8 E AY
# 9 E AY
# 10 E NaN
#
# Name System
# 0 A AZ
# 1 A NaN
# 2 B AZ
# 3 B NaN
# 4 B NaN
# 7 D AZ
#
# Name System
# 11 F AZ
# 12 F AZ
# 13 F NaN