如何通过正则修改pandas索引并匹配另一DataFrame索引
现有代码无效的原因
- 第一,
re.sub()不会修改原字符串(Python中字符串是不可变对象),只会返回处理后的新字符串。你的循环里既没有保存re.sub的返回结果,也没有将处理后的值重新赋值给meth_450的索引,循环执行完不会对原DataFrame产生任何修改。 - 第二,你写的正则规则本身不符合数据特征:正则中写了匹配冒号
:的逻辑,但你的索引字符串里不存在冒号,全由连字符-分隔字段,就算给返回值赋值,也无法匹配到目标片段,得不到正确的截取结果。
正确实现方式
不需要写循环,直接用pandas自带的向量化字符串操作即可,效率更高也更简洁,推荐用字符串拆分拼接的写法,不容易写错规则:
# 按-拆分索引字符串,取前3段后重新用-拼接,赋值回原索引 meth_450.index = meth_450.index.str.split('-').str[:3].str.join('-')
执行完可以先打印前几行索引验证结果:
print(meth_450.index[:5])
预期输出为:
Index(['TCGA-06-0125', 'TCGA-06-0125', 'TCGA-06-0152', 'TCGA-06-0152', 'TCGA-06-0171'], dtype='object')
确认索引格式正确后,就可以执行你原来写的索引匹配筛选代码:
clin = clin[clin.index.isin(meth_450.index)]
如果你更习惯用正则实现,也可以用正则匹配截取的写法,效果完全一致:
# 正则捕获第三个连字符前的内容 meth_450.index = meth_450.index.str.extract(r'^([^-]+-[^-]+-[^-]+)')[0]
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

