[英]Regex to extract substring from pandas DataFrame column
我在 DataFrame 中有以下专栏。
col1
['SNOMEDCT_US:32113001', 'UMLS:C0265660']
['UMLS:C2674738', 'UMLS:C2674739']
['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455']
我想在 UMLS: 之后提取值并将其存储在另一列中。 我正在尝试执行以下代码行,但没有得到预期的 output。
df['col1'].str.extract(r'\['.*UMLS:(.*)]')
预期的 output 是:
col1 col2
['SNOMEDCT_US:32113001', 'UMLS:C0265660'] C0265660
['UMLS:C2674738', 'UMLS:C2674739'] C2674738, C2674739
['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455'] C1290857, C123455
您可以使用DataFrame.explode
将列表行转换为单个字符串行。 然后,您可以使用Series.str.extract
来匹配所需的正则表达式。 最后,您可以根据需要使用DataFrame.groupby
和DataFrame.agg
将col1
变回其与col2
的原始形式:
df = df.explode("col1")
df["col2"] = df["col1"].str.extract(r"UMLS:(.+)")
df = df.groupby(level=0).agg({
"col1": list,
"col2": lambda x: ", ".join(item for item in x if item == item)
})
这输出:
col1 col2
0 [SNOMEDCT_US:32113001, UMLS:C0265660] C0265660
1 [UMLS:C2674738, UMLS:C2674739] C2674738, C2674739
2 [UMLS:C1290857, SNOMEDCT_US:118930001, UMLS:C1... C1290857, C123455
我使用了我在https://regex101.com/测试过的不同 re
UMLS:(\w*)
使用以下命令,我得到了一个新列,其中的数据格式符合您的要求:
df['new'] = df['input'].apply(lambda x: re.findall(r"UMLS:(\w*)",x)).apply(lambda x: ','.join(map(str,x)))
first.apply() function 基于这个答案。 findall function 返回一个列表 ([C2674738, C2674739])。
由于您想要一个包含与找到的匹配项一样多的字符串,因此第二个 apply() function(基于此答案)会将列表转换为逗号分隔的字符串。
我希望有一个更优雅的答案:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.