You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python DataFrame中基于KMeans聚类结果按歌手分组的问题

歌手归类的理想处理方式

首先明确:class是类别型簇标签(0-3仅代表不同簇,没有数值大小的语义),直接取均值再按区间划分是不可行的——均值结果不对应任何实际簇,且簇之间是平等分类,不是连续数值区间,这种处理没有实际意义。

推荐以下几种可行方法:

  • 众数归类(最常用):统计每个歌手所有class标签中出现次数最多的簇,将歌手归为该簇,代表歌手的歌词最常被分到的类别。
    示例代码:
    df.groupby("singer")["class"].agg(lambda x: x.mode()[0])
    
  • 保留簇分布特征:不强行归为单一簇,输出歌手在各个簇的占比,比如歌手A的簇分布为[0.4, 0.3, 0.2, 0.1],这种方式保留了更丰富的语义信息,后续可基于分布做相似度分析等操作。
    示例代码:
    df.groupby("singer")["class"].value_counts(normalize=True).unstack(fill_value=0)
    
  • 基于歌手级特征二次聚类:回到歌词的768维向量,先计算每个歌手所有歌词向量的均值/中位数,得到歌手的语义代表向量,再对这些向量重新做KMeans聚类(可复用Elbow/Silhouette法确定簇数),直接得到歌手的归类结果,这种方法更直接地基于语义聚合歌手。
groupby后调用head()行数增加的原因

groupby("singer")["class"].head() 的作用是提取每个分组(每个歌手)的前N行数据,默认N=5。你的原始数据中每个歌手都有多条记录,所以输出的是所有歌手各自的前5行数据,行数等于「歌手数量 × 5」(若某歌手记录不足5条则取全部),自然会比单个歌手的行数多,甚至接近原始数据总行数(当大部分歌手记录≥5条时)。

如果需要每个歌手一行的聚合结果,要使用agg、mode、value_counts这类聚合函数,head()只是提取分组内的原始数据片段,并非聚合操作。

内容的提问来源于stack exchange,提问作者Türker ÖNER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:15:22