Python DataFrame按kmeans结果groupby时不展示全部分类的问题
问题成因分析
以下是导致该问题的常见原因,按发生概率从高到低排列:
- 分组字段名不匹配:你新增的聚类结果字段名为
kmeans categories,但代码中分组时使用的字段名是kmeans,如果你的数据集里不存在名为kmeans的字段,或者kmeans字段本身就只有0-4共5个取值,就会出现该问题。 - 分类5、6、7的样本已被提前过滤:你在聚类完成后到执行分组计算的过程中,可能执行了
dropna()、条件筛选、切片等操作,把属于5、6、7分类的样本全部删除了。你之前确认的「分类列有8个唯一值」可能是聚类刚结束时的结果,并非执行分组时用到的speed数据集的实际情况。你可以先执行print(speed['kmeans'].unique())验证分组字段的实际取值。 - 空簇/无有效样本的分类被自动丢弃:
- 若5、6、7三个分类下的所有样本的24小时速度列全部为空值,
mean()计算时会自动丢弃全为空值的分组 - KMeans聚类过程中可能生成了空簇,虽然你设置了
n_clusters=8,但受样本分布、初始化参数影响,部分簇没有被分配任何样本,实际数据集里不存在属于5、6、7分类的样本
你可以执行print(speed['kmeans'].value_counts(dropna=False))查看每个分类的样本量,确认5、6、7分类的样本数是否为0。
- 若5、6、7三个分类下的所有样本的24小时速度列全部为空值,
- 分组时默认丢弃空值分类:如果你的
kmeans字段中5、6、7的取值实际为空值,pandas的groupby默认会跳过空值分组,可以指定dropna=False参数保留空值分组,代码调整为speed_kmeans= speed.groupby(['kmeans'], dropna=False).mean()即可。 - 聚类标签赋值错误:你在把聚类结果写入数据集的
kmeans字段时可能出现了赋值逻辑错误,比如只把前5个分类的标签写入了数据集,5、6、7的标签没有被正确写入。
内容的提问来源于stack exchange,提问作者CWeeks
相关产品推荐
相关产品推荐

