You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:40:17