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="弱"
要找到最佳聚类,请找到每列的平均值,然后求和,如果最高则将其分配给“最佳”,将其分配给“最佳”,将其分配给“平均”,将“最低”分配给“弱”
请帮忙谢谢
groupby
和 apply
聚类函数
我们可以按 month
对数据帧进行分组,并使用自定义聚类函数
对 X2
和 X3
列进行聚类
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
我想使用 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="弱"
要找到最佳聚类,请找到每列的平均值,然后求和,如果最高则将其分配给“最佳”,将其分配给“最佳”,将其分配给“平均”,将“最低”分配给“弱”
请帮忙谢谢
groupby
和 apply
聚类函数
我们可以按 month
对数据帧进行分组,并使用自定义聚类函数
X2
和 X3
列进行聚类
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