合并索引匹配的DataFrame遇DataError,求正确生成meth_sub的方法
问题:合并DataFrame并匹配索引提取指定列
需要找到DataFrame meth450_clin_kipan 和 meth_450_10k_kipan 中索引值相同的行,当索引匹配时,提取meth450_clin_kipan中的admin.disease_code列,与meth_450_10k_kipan合并生成新DataFrame meth_sub。
原错误代码
# Add tumor subtype info to methylation df # If TCGA ID in clinical df matches the TCGA ID in methylation df, retrieve the "admin.disease_code" column value from the clinical df meth_sub = pd.concat([meth450_clin_kipan, meth_450_10k_kipan], 1).dropna().mean(axis=1, level=0) meth_sub
报错信息
DataError: No numeric types to aggregate
样例数据
meth450_clin_kipan 样例
meth450_clin_kipan.iloc[0:3,0:3].to_dict() {'admin.disease_code': {'TCGA-2K-A9WE-01A': 'kirp', 'TCGA-2Z-A9J1-01A': 'kirp', 'TCGA-2Z-A9J2-01A': 'kirp'}, 'days_to_death': {'TCGA-2K-A9WE-01A': nan, 'TCGA-2Z-A9J1-01A': nan, 'TCGA-2Z-A9J2-01A': nan}, 'vital_status': {'TCGA-2K-A9WE-01A': 'alive', 'TCGA-2Z-A9J1-01A': 'alive', 'TCGA-2Z-A9J2-01A': 'alive'}}
meth_450_10k_kipan 样例
meth_450_10k_kipan.iloc[0:3,0:3].to_dict() {'cg00000029': {'TCGA-2K-A9WE-01A': 0.461440642939772, 'TCGA-2Z-A9J1-01A': 0.595894468074615, 'TCGA-2Z-A9J2-01A': 0.481304782143526}, 'cg00000165': {'TCGA-2K-A9WE-01A': 0.143910373119058, 'TCGA-2Z-A9J1-01A': 0.0807243779293262, 'TCGA-2Z-A9J2-01A': 0.437447195378987}, 'cg00000236': {'TCGA-2K-A9WE-01A': 0.847164847154162, 'TCGA-2Z-A9J1-01A': 0.867305510246114, 'TCGA-2Z-A9J2-01A': 0.898927359292032}}
期望输出格式
| cg00000029 | cg00000165 | cg00000236 | admin.disease_code | |
|---|---|---|---|---|
| TCGA-2K-A9WE-01A | 0.461440642939772 | 0.143910373119058 | 0.847164847154162 | kirp |
| TCGA-2Z-A9J1-01A | 0.595894468074615 | 0.0807243779293262 | 0.867305510246114 | kirp |
| TCGA-2Z-A9J2-01A | 0.481304782143526 | 0.437447195378987 | 0.898927359292032 | kirp |
错误原因
原代码逻辑完全偏离需求:
- 使用
pd.concat合并后调用mean(axis=1, level=0),但meth450_clin_kipan包含字符串类型列(如admin.disease_code),mean仅支持数值类型计算,因此触发DataError。 - 需求是合并匹配索引的指定列,无需计算均值。
正确实现代码
方法1:用join合并(推荐)
利用DataFrame的join方法,默认按索引匹配,仅提取目标列合并:
# 提取临床数据中需要的列,按索引与甲基化数据合并(只保留共同索引行) meth_sub = meth_450_10k_kipan.join(meth450_clin_kipan['admin.disease_code'], how='inner')
方法2:用merge合并
指定按索引匹配,同样只提取目标列:
meth_sub = pd.merge( meth_450_10k_kipan, meth450_clin_kipan[['admin.disease_code']], left_index=True, right_index=True, how='inner' )
两种方法均可生成符合期望的meth_sub,包含甲基化数据的所有列及匹配的admin.disease_code列。
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

