pandas 数据框中每个组的 Kmeans 聚类并分配聚类

Kmeans Cluster for each group in pandas dataframe and assign clusters

我想使用 kmeans 聚类对组月份的 X2 和 X3 进行聚类。我需要对两个变量进行聚类。此外,我想根据每个集群的平均值将集群 0、集群 1 和集群 2 分配给“强”、“平均”、“弱”,最高意味着强集群。下面是我的示例数据集。

df=pd.DataFrame({'month':['1','1','1','1','1','2','2','2','2','2','2','2'],'X1': 
[30,42,25,32,12,10,4,6,5,10,24,21],'X2':[10,76,100,23,65,94,67,24,67,54,87,81],'X3': 
[23,78,95,52,60,76,68,92,34,76,34,12]})
df

我需要自动执行此操作,从那时起我有很多列我想在 2 个列 (df.loc[:,2:3]) 上执行此操作。为每个 def 分配集群是

集群 2="最佳"

集群 1="平均"

集群 0="弱"

要找到最佳聚类,请找到每列的平均值,然后求和,如果最高则将其分配给“最佳”,将其分配给“最佳”,将其分配给“平均”,将“最低”分配给“弱”

请帮忙谢谢

groupbyapply 聚类函数

我们可以按 month 对数据帧进行分组,并使用自定义聚类函数

X2X3 列进行聚类
cols = df.columns[2:4]
mapping = {0: 'weak', 1: 'average', 2: 'best'}

def cluster(X):
    k_means = KMeans(n_clusters=3).fit(X)
    return X.groupby(k_means.labels_)\
            .transform('mean').sum(1)\
            .rank(method='dense').sub(1)\
            .astype(int).to_frame()

df['Cluster_id'] = df.groupby('month')[cols].apply(cluster)
df['Cluster_cat'] = df['Cluster_id'].map(mapping)

   month  X1   X2  X3  Cluster_id Cluster_cat
0      1  30   10  23           0        weak
1      1  42   76  78           1     average
2      1  25  100  95           2        best
3      1  32   23  52           0        weak
4      1  12   65  60           1     average
5      2  10   94  76           2        best
6      2   4   67  68           2        best
7      2   6   24  92           1     average
8      2   5   67  34           0        weak
9      2  10   54  76           2        best
10     2  24   87  34           0        weak
11     2  21   81  12           0        weak