如何用正则表达式从Pandas DataFrame列提取UMLS后缀子串
解决方法
情况1:col1是字符串类型(形如"['SNOMEDCT_US:32113001', 'UMLS:C0265660']")
你原来的正则有两个问题:一是.*属于贪婪匹配,会直接跳到最后一个UMLS:之前的内容,导致只提取到最后一个UMLS值;二是str.extract默认只抓第一个匹配项,没法处理多个结果。
可以用str.findall先提取所有符合规则的内容,再用str.join把结果拼成逗号分隔的字符串:
import pandas as pd # 模拟你的数据 data = { 'col1': [ "['SNOMEDCT_US:32113001', 'UMLS:C0265660']", "['UMLS:C2674738', 'UMLS:C2674739']", "['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455']" ] } df = pd.DataFrame(data) # 提取所有UMLS后的数值并拼接 df['col2'] = df['col1'].str.findall(r'UMLS:(\w+)').str.join(', ')
运行后得到的结果完全符合预期:
col1 col2 0 ['SNOMEDCT_US:32113001', 'UMLS:C0265660'] C0265660 1 ['UMLS:C2674738', 'UMLS:C2674739'] C2674738, C2674739 2 ['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455'] C1290857, C123455
情况2:col1是实际的Python列表对象(形如['SNOMEDCT_US:32113001', 'UMLS:C0265660'])
如果col1里存的是真实列表,直接用apply遍历每个元素,筛选出带UMLS:的项,分割后取后面的部分再拼接:
import pandas as pd # 模拟你的数据 data = { 'col1': [ ['SNOMEDCT_US:32113001', 'UMLS:C0265660'], ['UMLS:C2674738', 'UMLS:C2674739'], ['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455'] ] } df = pd.DataFrame(data) # 处理列表类型的列 df['col2'] = df['col1'].apply( lambda x: ', '.join([item.split('UMLS:')[1] for item in x if 'UMLS:' in item]) )
关键说明
str.findall(r'UMLS:(\w+)'):用正则匹配所有UMLS:后面的字母数字组合,返回所有匹配值组成的列表str.join(', '):把列表里的多个值用逗号加空格连接成字符串- 列表类型的处理中,
split('UMLS:')[1]直接分割字符串取后半段,比正则更简洁直接
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

