使用sklearn执行fit_transform时如何忽略索引列进行MDS降维?
问题原因
你出现报错是因为两个未注意到的代码问题:
df.set_index('Tissue')没有赋值回原变量,执行后df仍然保留Tissue列,并没有真的将Tissue设为索引,传入MDS计算时会把Tissue列的字符串也带入计算,触发类型错误- 构造DataFrame时所有基因的数值都是用字符串格式传入的(包裹了引号),即使你正确筛选了基因列,也需要先转成浮点型才能被MDS算法识别计算
解决方案
两种常用实现方式都可以满足需求,不需要手动先移除再加回Tissue信息:
方案1:正确设置索引后执行计算
# 把Tissue列设为索引,赋值回df完成修改 df = df.set_index('Tissue') # 将所有基因列转换为浮点型数值 df = df.astype(float) # 执行MDS降维 mds = MDS(2, random_state=0) df_2d = mds.fit_transform(df) # 合并降维结果与Tissue索引,方便后续绘图分组 mds_result = pd.DataFrame(df_2d, columns=['MDS1', 'MDS2'], index=df.index).reset_index()
方案2:显式选择基因列计算,保留原DataFrame结构
如果不想修改原df的结构,可以直接指定参与计算的基因列:
# 筛选所有基因列,转换为浮点型 gene_cols = [col for col in df.columns if col.startswith('Gene')] gene_data = df[gene_cols].astype(float) # 执行MDS降维 mds = MDS(2, random_state=0) df_2d = mds.fit_transform(gene_data) # 合并降维结果与原Tissue列 mds_result = pd.DataFrame(df_2d, columns=['MDS1', 'MDS2']) mds_result['Tissue'] = df['Tissue']
后续如果要绘制分组MDS散点图,直接使用合并了Tissue信息的mds_result即可按组织类型给点上色。
内容的提问来源于stack exchange,提问作者millie0725
相关产品推荐
相关产品推荐

