Python 在数据帧中按KMeans群集分组

Python 在数据帧中按KMeans群集分组,python,pandas,Python,Pandas,我想为X3列的每个月在dataframe下面进行聚类。我该怎么做 df=pd.DataFrame({'Month':[1,1,1,1,1,1,3,3,3,3,3,3,3],'X1':[10,15,24,32,8,6,10,23,24,56,45,10,56] ,'X2':[12,90,20,40,10,15,30,40,60,42,2,4,10],'X3':[34,65,34,87,100,65,78,67,34,98,96,46,76]}) 下面是我试过但不起作用的内容 cols=d

我想为X3列的每个月在dataframe下面进行聚类。我该怎么做

 df=pd.DataFrame({'Month':[1,1,1,1,1,1,3,3,3,3,3,3,3],'X1':[10,15,24,32,8,6,10,23,24,56,45,10,56]
   ,'X2':[12,90,20,40,10,15,30,40,60,42,2,4,10],'X3':[34,65,34,87,100,65,78,67,34,98,96,46,76]})
下面是我试过但不起作用的内容

cols=df.columns[3]

def cluster(X):
    k_means = KMeans(n_clusters=3).fit(X)
    return X.assign(clusters=k_means.labels_)

df['cluster_id'] = df.groupby('Month')[cols].apply(cluster)

请帮助,谢谢。

sklearn
的KMeans通常期望功能是二维数组,而不是经过时的一维向量。因此,您需要将
X
修改为数组。此外,如果您想依靠
group by combine
机制,为什么不将列索引放在to apply函数中,因为从这样的操作进行分配很麻烦

cols=df.columns[3]
def cluster(X):
    feature = X[cols].to_numpy().reshape((len(X), 1))
    k_means = KMeans(n_clusters=3).fit(feature)
    X['cluster'] = k_means.labels_
    return X
    
df= df.groupby('Month').apply(cluster)

您可以使用
GroupBy.transform
来形成簇标签。对功能的更改包括:

  • 将传入列值重新设置为
    (n_samples,1)
    ,以便
    sklearn
    满意
  • 不将结果
    k_表示.标签直接分配给函数中的任何内容,而是将其返回给
    transform
所以

在这里,我们使用
pd.Index
而不是Python列表来简化向
cols
的每个元素添加字符串
“\u cluster\u id”

得到

    Month  X1  X2   X3  X3_cluster_id
0       1  10  12   34              1
1       1  15  90   65              0
2       1  24  20   34              1
3       1  32  40   87              2
4       1   8  10  100              2
5       1   6  15   65              0
6       3  10  30   78              2
7       3  23  40   67              2
8       3  24  60   34              0
9       3  56  42   98              1
10      3  45   2   96              1
11      3  10   4   46              0
12      3  56  10   76              2
    Month  X1  X2   X3  X3_cluster_id
0       1  10  12   34              1
1       1  15  90   65              0
2       1  24  20   34              1
3       1  32  40   87              2
4       1   8  10  100              2
5       1   6  15   65              0
6       3  10  30   78              2
7       3  23  40   67              2
8       3  24  60   34              0
9       3  56  42   98              1
10      3  45   2   96              1
11      3  10   4   46              0
12      3  56  10   76              2