如何基于DataFrame的Status字段聚类并可视化?K-Means是否适用?
问题分析与解决方案
你这里不需要用K-Means算法——K-Means是无监督聚类算法,作用是让算法从无标签数据中自动发现聚类模式,但你的需求是基于已有的Status字段做明确的标签映射(Bot→Cluster1,Human→Cluster2),属于直接的规则赋值,硬用K-Means反而多余,甚至可能因为Age的分布导致聚类结果不符合预期。
步骤1:生成Cluster列
直接通过字典映射给DataFrame添加Cluster字段,代码如下:
import pandas as pd # 构造你的数据集 data = { 'Name': ['Xenon', 'Carrie', 'Argon', 'Carol', 'Neon'], 'Age': [3, 16, 6, 7, 5], 'Status': ['Bot', 'Human', 'Bot', 'Human', 'Human'] } df = pd.DataFrame(data) # 按Status映射Cluster cluster_mapping = {'Bot': 1, 'Human': 2} df['Cluster'] = df['Status'].map(cluster_mapping)
执行后得到的DataFrame:
Name Age Status Cluster
Xenon 3 Bot 1
Carrie 16 Human 2
Argon 6 Bot 1
Carol 7 Human 2
Neon 5 Human 2
步骤2:可视化实现
可以用Matplotlib或Seaborn绘制散点图,展示不同Cluster的Age分布,同时标注样本名称:
Matplotlib实现代码
import matplotlib.pyplot as plt plt.figure(figsize=(8, 5)) # 按Cluster分组绘制散点 for cluster_id in df['Cluster'].unique(): group = df[df['Cluster'] == cluster_id] plt.scatter(group['Age'], [cluster_id]*len(group), s=120, label=f'Cluster {cluster_id}') # 标注每个样本的Name for _, row in group.iterrows(): plt.text(row['Age'], row['Cluster'], row['Name'], ha='center', va='bottom', fontsize=10) plt.yticks([1, 2], ['Cluster 1 (Bot)', 'Cluster 2 (Human)']) plt.xlabel('Age') plt.title('Cluster Distribution by Age') plt.legend() plt.grid(axis='x', linestyle='--', alpha=0.7) plt.show()
Seaborn简化实现代码
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8, 5)) sns.scatterplot(data=df, x='Age', y='Cluster', hue='Cluster', s=120, palette={1: '#1f77b4', 2: '#ff7f0e'}) # 标注样本名称 for _, row in df.iterrows(): plt.text(row['Age'], row['Cluster'], row['Name'], ha='center', va='bottom', fontsize=10) plt.yticks([1, 2], ['Cluster 1 (Bot)', 'Cluster 2 (Human)']) plt.xlabel('Age') plt.title('Cluster Distribution by Age') plt.legend(title='Cluster') plt.show()
总结
- 直接通过
Status字段映射Cluster是最准确高效的方式,完全不需要聚类算法 - 可视化可以直观展示不同Cluster的Age分布差异,标注名称后更便于识别单个样本
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

