KMeans表示使用Python进行集群

问题描述

我有一个数据集

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

使用此数据集时,我需要根据";系统&为特定";名称&Quot;重复的次数对数据集进行群集。

在上面的示例中,名称A、B和D有一个子集,而C、E有两个子集,F有两个AZ,因此它是一个不同的集群。

输出示例:

Cluster     Names
AZ          A,B
AY,AY       C,E
AZ,AZ       F 

PS。实际数据集的行数和列数可能不同 如何使用基于ML的聚类算法(如KNN、朴素贝叶斯等)来实现这一点? 我需要两种方法,一种不忽略NaN,另一种忽略NaN。


解决方案

IIUC,这看起来像一个双倍groupby。您首先需要按名称和系统进行分组,并聚合系统以形成集群。则这是一个简单的groupby,聚合为字符串。

(df.groupby(['Name', 'System'])
   ['System'].agg(Cluster=','.join)          # clusters of repeats
   .droplevel('System').reset_index()
   .groupby('Cluster')['Name'].agg(','.join) # aggregate by cluster
   .reset_index()
)

输出:

  Cluster   Name
0   AY,AY    C,E
1      AZ  A,B,D
2   AZ,AZ      F

Nb。我在这里使用了','.join聚合,但您也可以使用tuple或自定义函数(第一个groupby)和frozenset(第二个groupby)来保持对单个元素的访问

(df.groupby(['Name', 'System'], dropna=False)
   ['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)     (E, C)
1   (AZ, 1)  (B, A, D)
2   (AZ, 2)        (F)
3  (nan, 1)  (E, F, A)
4  (nan, 2)        (B)

相关文章