Python 在数据帧中按KMeans群集分组
我想为X3列的每个月在dataframe下面进行聚类。我该怎么做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
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