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

如何从sns.clustermap中提取聚类标签与自定义聚类成员?

提取Seaborn Clustermap中自定义视觉聚类的多级索引标签

问题背景

使用sns.clustermap绘制含多级索引的相关DataFrame时,工具会自动将多级索引作为标签显示在聚类图的右侧和下方。当用该图探索100-200条数据的大型数据集时,需要提取视觉自定义划分的聚类成员列表,而非自动聚类算法给出的归属结果。官方提供的clustergrid.dendrogram_row.reordered_ind仅返回原DataFrame的索引序号,无法直接得到类似df.columns的标签输出。

示例代码:

import pandas as pd
import numpy as np
import seaborn as sns

elev = [1, 100, 10, 1000, 100, 10]
number = [1, 2, 3, 4, 5, 6]
name = ['foo', 'bar', 'baz', 'qux', 'quux', 'quuux']
idx = pd.MultiIndex.from_arrays([name, elev, number], 
                                 names=('name','elev', 'number'))
data = np.random.rand(20,6)
df = pd.DataFrame(data=data, columns=idx)

clustermap = sns.clustermap(df.corr())

绘制的聚类图视觉上可分为两个聚类:[foo-1-1, bar-100-2]和[baz-10-3, qux-1000-4, quux-100-5, quuux-10-6],需要高效提取这类聚类成员。

解决方案

1. 获取聚类图重排后的完整标签列表

利用reordered_ind返回的索引序号,直接索引原DataFrame的多级索引列,得到聚类图中显示顺序的完整标签:

# 获取重排后的多级索引标签(对应聚类图右侧/下方的标签顺序)
reordered_labels = df.columns[clustermap.dendrogram_row.reordered_ind]

2. 根据视觉聚类手动划分成员

观察聚类图的树状图分界位置,对重排后的标签列表进行切片,得到对应聚类的成员:

# 示例:根据视觉划分的两个聚类切片
cluster_1 = reordered_labels[:2].tolist()
cluster_2 = reordered_labels[2:].tolist()

# 可选:将多级索引元组转换为字符串格式(如"foo-1-1")
cluster_1_formatted = ['-'.join(map(str, item)) for item in cluster_1]
cluster_2_formatted = ['-'.join(map(str, item)) for item in cluster_2]

print("第一个聚类成员:")
print(cluster_1_formatted)
print("\n第二个聚类成员:")
print(cluster_2_formatted)

说明

  • dendrogram_row.reordered_ind存储的是聚类后行(此处对应原DataFrame的列,因为绘制的是列的相关矩阵)的原索引位置,用它索引df.columns即可得到与聚类图标签顺序完全一致的多级索引。
  • 对于大型数据集,只需观察树状图的分界点,确定切片的起始/结束位置,即可快速提取任意视觉聚类的成员,无需手动记录。

内容的提问来源于stack exchange,提问作者JC_CL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:06:23