从PandasDataFrame列提取子字符串的正则表达式

bvjxkvbb  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(170)

我在DataFrame中有以下列。

col1
['SNOMEDCT_US:32113001', 'UMLS:C0265660']
['UMLS:C2674738', 'UMLS:C2674739']
['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455']

我想提取UMLS之后的值:并将其存储在另一列中。我正在尝试以下代码行,但没有得到预期的输出。

df['col1'].str.extract(r'\['.*UMLS:(.*)]')

预期输出为:

col1                                                            col2
['SNOMEDCT_US:32113001', 'UMLS:C0265660']                       C0265660
['UMLS:C2674738', 'UMLS:C2674739']                              C2674738, C2674739
['UMLS:C1290857', 'SNOMEDCT_US:118930001', 'UMLS:C123455']      C1290857, C123455
qcbq4gxm

qcbq4gxm1#

可以使用DataFrame.explode将列表的行转换为单个字符串的行,然后使用Series.str.extract匹配所需的正则表达式,最后使用DataFrame.groupbyDataFrame.aggcol1转换回其原始形式,并根据需要使用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
czq61nw1

czq61nw12#

我使用了在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)))

第一个.apply()函数基于这个answer,findall函数返回一个列表([C2674738,C2674739])。
由于您希望字符串包含找到的所有匹配项,因此第二个apply()函数(基于answer)将把列表转换为逗号分隔的字符串。
希望有更优雅的答案:-)

相关问题