使用Kmeans生成分组聚类中心:循环创建logCenters DataFrame遇报错
嘿,我懂你遇到的问题了——其实完全不用手动遍历groupby的组来计算聚类中心哦,不管是用KMeans自带的属性,还是直接用groupby的聚合方法,都能轻松搞定,还能避免遍历过程中可能踩的各种小坑。
方法一:直接用KMeans的cluster_centers_(最推荐)
KMeans在拟合数据后,cluster_centers_已经帮你算好了每个簇的中心,这是一个二维数组,每行对应一个簇的特征均值。你直接把它转成DataFrame就行,步骤超简单:
import pandas as pd from sklearn.cluster import KMeans # 假设你已经完成了聚类,比如: # 先定义特征列(排除非数值列,比如聚类结果列本身) feature_cols = [col for col in df.columns if col != 'clusters'] # 拟合KMeans模型 kmeans = KMeans(n_clusters=你的簇数, random_state=42) df['clusters'] = kmeans.fit_predict(df[feature_cols]) # 用cluster_centers_生成聚类中心DataFrame logCenters = pd.DataFrame(kmeans.cluster_centers_, columns=feature_cols) # 添加簇编号列,和原DataFrame的clusters对应 logCenters['clusters'] = range(kmeans.n_clusters)
这种方法既高效又准确,完全不用手动遍历分组,还能保证和KMeans模型输出的簇编号完全对应。
方法二:用groupby的mean()方法验证/替代
如果你想通过分组计算来验证中心(或者你用的不是KMeans聚类),其实groupby直接调用mean()就能得到每个簇的中心(因为KMeans的中心本质就是簇内样本的特征均值):
# 按clusters分组,计算每个组的特征均值 logCenters = df.groupby('clusters')[feature_cols].mean().reset_index()
这里要注意:一定要指定feature_cols,如果原DataFrame里有非数值列(比如字符串、分类列),直接groupby.mean()会自动忽略这些列,但手动指定特征列更稳妥,避免不必要的错误。
为什么你之前遍历会出错?
大概率是遍历分组时的细节没处理好:比如没有正确提取每个组的特征列,或者计算均值时不小心包含了非数值列(比如clusters列本身),甚至是遍历过程中追加DataFrame的方式不对(比如用append效率低还容易出错,现在推荐用pd.concat)。上面两种方法都帮你避开了这些问题。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

