赋值cut_tree生成的聚类标签后DataFrame缺失200行问题求助
聚类后DataFrame行丢失排查思路与解决方案
排查步骤
- 核对数据长度匹配性:依次打印
len(聚类输入特征矩阵)、len(cluster_labels)、赋值标签前的rfm.shape[0],确认三者数值是否一致。90%以上的这类问题都是特征缩放、移除离群值后,仅过滤了用于聚类的特征集,没有同步过滤rfm主表,导致特征集本身就比rfm少200行。 - 校验索引对齐性:分别输出rfm的索引
rfm.index和聚类输入特征集的索引,确认两个索引序列是否完全重合。如果特征处理过程中执行过reset_index()操作但rfm未同步修改,pandas按索引赋值时会给不匹配的行填充空值,后续如果有隐式删空操作就会丢失行。 - 定位行数减少的节点:在执行
rfm['cluster_labels'] = cluster_labels代码前后分别打印rfm.shape[0],确认行数减少是否发生在赋值阶段。如果赋值前就已经少了200行,需要回溯之前的操作代码是否有隐式过滤。 - 验证cut_tree输出长度:层次聚类的合并矩阵
mergings是基于输入样本量生成的,输入n个样本时cut_tree输出的标签长度必然为n,如果len(cluster_labels)不等于预期的50000,可直接确认聚类输入的样本量本身就只有49800个。
解决方案
- 同步主表与特征集的行:如果确认是特征过滤后未同步rfm,直接用特征集的索引对rfm做切片,再赋值标签即可:
# feature_matrix为你输入层次聚类的特征数据集 rfm = rfm.loc[feature_matrix.index] rfm['cluster_labels'] = cluster_labels - 统一索引避免匹配错误:如果是索引不一致导致的赋值空值,处理完特征后同时给特征集和rfm重置索引再赋值:
feature_matrix = feature_matrix.reset_index(drop=True) rfm = rfm.reset_index(drop=True) rfm['cluster_labels'] = cluster_labels - 空值特殊处理:如果需要保留无聚类标签的200行,赋值后可单独给空值打特殊标记,避免被后续的
dropna()误删:rfm['cluster_labels'] = rfm['cluster_labels'].fillna(-1)
内容的提问来源于stack exchange,提问作者adey27
相关产品推荐
相关产品推荐

