![](/img/trans.png)
[英]Kmeans Cluster for each group in pandas dataframe and assign clusters
[英]Group by KMeans cluster in pandas dataframe
對於 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)
請幫忙謝謝。
KMeans
的sklearn
通常期望特征是二維數組,而不是您傳遞的一維向量。 所以你需要將你的X
修改為一個數組。 此外,如果你想依賴group-by-combine
機制,為什么不將列索引放在申請 function 中,因為這樣的操作分配很麻煩。
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
來形成集群標簽。 您的 function 的更改是:
(n_samples, 1)
以便sklearn
滿意k_means.labels_
直接分配給 function 中的任何內容,而是將其返回以進行transform
所以
def cluster(X, n_clusters):
k_means = KMeans(n_clusters=n_clusters).fit(X.values.reshape(-1, 1))
return k_means.labels_
cols = pd.Index(["X3"])
df[cols + "_cluster_id"] = df.groupby("Month")[cols].transform(cluster, n_clusters=3)
我們使用pd.Index
而不是 Python 列表來簡化將字符串"_cluster_id"
添加到cols
的每個元素。
要得到
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.