匹配Pandas索引与列表补全缺失字符,解决维度不匹配报错
问题描述
需求:将common_samples中每个字符串去掉最后一位后,与mrna_raw.index进行匹配,匹配成功的条目,把mrna_raw.index中的对应值替换为common_samples的完整字符串。
原代码直接比较长度不同的列表与Pandas索引,触发报错:ValueError: ('Shapes must match', (323,), (202,)),原代码如下:
import pandas as pd common_samples = pd.Index(set(kirp_meth.columns)&set(mrna_norm.index)&set(kirp_mut.index)&set(kirp_cna.index)&set(kirp_protein.index)).sort_values() if [x[:-1] for x in common_samples] == mrna_raw.index: mrna_raw.index + [x[-1:] for x in common_samples]
示例数据
common_samples
Index(['TCGA-2K-A9WE-01A', 'TCGA-2Z-A9J1-01A', 'TCGA-2Z-A9J3-01A'], dtype='object', length=3)
mrna_raw.index
Index(['TCGA-2K-A9WE-01', 'TCGA-2Z-A9J1-01', 'TCGA-2Z-A9J2-01', 'TCGA-2Z-A9J3-01'], dtype='object', length=4)
对应DataFrame
pd.DataFrame({'A1BG': {'TCGA-2K-A9WE-01': 391.94, 'TCGA-2Z-A9J1-01': 68.91, 'TCGA-2Z-A9J2-01': 37.0}, 'A1CF': {'TCGA-2K-A9WE-01': 8.0, 'TCGA-2Z-A9J1-01': 75.0, 'TCGA-2Z-A9J2-01': 14.0}, 'A2BP1': {'TCGA-2K-A9WE-01': 1.0, 'TCGA-2Z-A9J1-01': 0.0, 'TCGA-2Z-A9J2-01': 0.0}})
期望输出
新的mrna_raw.index:
Index(['TCGA-2K-A9WE-01A', 'TCGA-2Z-A9J1-01A', 'TCGA-2Z-A9J3-01A'], dtype='object', length=3)
解决方案
原代码的核心问题是逻辑错误——试图整体比较两个长度不同的序列,而非逐个匹配替换。正确思路是通过字典建立短样本名到完整样本名的映射,再筛选替换索引:
修正后的代码:
import pandas as pd # 保留原common_samples生成逻辑 common_samples = pd.Index(set(kirp_meth.columns)&set(mrna_norm.index)&set(kirp_mut.index)&set(kirp_cna.index)&set(kirp_protein.index)).sort_values() # 构建短样本名到完整样本名的映射字典 sample_map = {sample[:-1]: sample for sample in common_samples} # 筛选匹配行并替换索引 mrna_raw = mrna_raw[mrna_raw.index.isin(sample_map.keys())].rename(index=sample_map)
代码说明
sample_map:用字典推导式快速建立映射,查询效率远高于循环比对;mrna_raw.index.isin(sample_map.keys()):自动过滤掉不匹配的索引条目(如示例中的TCGA-2Z-A9J2-01);.rename(index=sample_map):将符合条件的索引直接替换为common_samples中的完整字符串。
该方案既解决了原代码的形状不匹配报错,又精准实现了需求,同时保证了代码运行效率。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

