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

如何将DBSCAN聚类标签标注到原始Pandas DataFrame中

解决方法

你的需求核心是把DBSCAN的聚类标签映射回原始数据并导出,这里给你调整代码并说明关键步骤:

关键修改点

  • 保留原始完整的DataFrame,不要直接在上面删列(之前的代码直接修改了X,导致原始数据丢失)
  • 修复标签获取的笔误(你写的def_inst_dbsc是错误的,应该用训练好的DBSCAN实例db)
  • 添加聚类标签到原始数据,然后导出CSV

修改后的完整代码

import argparse
import string
import os, subprocess
import pathlib
import glob
import gzip
import re
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from sklearn.cluster import DBSCAN

# 读取原始完整数据,保留所有列
raw_df = pd.read_csv(tmp_csv_name)
# 仅提取x、y列用于DBSCAN训练
X = raw_df[['x', 'y']]

# 训练DBSCAN聚类模型
db = DBSCAN(eps=EPS, min_samples=minSamples, metric='euclidean', algorithm='auto', leaf_size=30).fit(X)
# 获取每个样本的聚类标签,-1代表该点是噪声点
labels = db.labels_
unique_labels = set(labels)

# 把聚类标签添加到原始DataFrame的新列中
raw_df['cluster_label'] = labels

# 导出包含聚类标签的CSV文件,可自行修改输出路径
raw_df.to_csv('labeled_spatial_data.csv', index=False)

# 以下为原可视化代码,优化了颜色映射逻辑
# 生成对应聚类标签的颜色,噪声点单独用黑色
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
# 这里填入你原来的sizeX、sizeY初始值
sizeX, sizeY = 20, 20
while sizeX > 16 or sizeY > 16 :
    sizeX *= 0.8 
    sizeY *= 0.8
fig, ax = plt.subplots(figsize=(sizeX,sizeY))
plt.xlim(0, maxX)
plt.ylim(0, maxY)

# 按聚类标签分颜色绘图
for k, col in zip(unique_labels, colors):
    if k == -1:
        # 噪声点统一用黑色
        col = [0, 0, 0, 1]
    class_member_mask = (labels == k)
    xy = X[class_member_mask]
    ax.scatter(xy['x'], xy['y'], c=[col], marker="o", picker=True)

# 添加原始数据集边界多边形
poly = patches.Polygon(xy=list(zip(hackX,hackY)), fill=False)
ax.add_patch(poly)
plt.show()

说明

  • raw_df全程保留原始数据的所有字段,我们仅用它的x、y坐标训练聚类模型
  • 新增的cluster_label列中,-1代表该数据点是噪声点(不属于任何聚类),非负整数为对应聚类的编号
  • 导出CSV时用index=False,避免把DataFrame的索引写入文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:04