解析数据框列以获取子字符串并返回值

Posted

技术标签:

【中文标题】解析数据框列以获取子字符串并返回值【英文标题】:Parse dataframe column for substring and return value 【发布时间】:2021-03-24 17:34:04 【问题描述】:

我有一个名为“INFO”的列的数据框,其中包含一个由分号分隔的字符串,如下所示。我想解析字符串以返回与特定子字符串对应的值并将其分配给新列。

前。在下表中,我想将“CLNDISDB”的值(在等号之后)分配给同名的列。

我试过了:

df['INFO'].str.split(';',expand=True)

将每个字符串部分分配给一个新列,但这仍然需要我解析每一列以获取必要的字符串。任何帮助将不胜感激。

我只能使用python标准库


|    | INFO                                              |
|----|---------------------------------------------------|
| 0  | AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619;... |
| 1  | AF_ESP=0.00015;AF_EXAC=0.00010;ALLELEID=514926... |
| 2  | ALLELEID=181485;CLNDISDB=MedGen:C4015293,OMIM:... |
| 3  | ALLELEID=514896;CLNDISDB=MedGen:C4015293,OMIM:... |
| 4  | AF_ESP=0.00515;AF_EXAC=0.00831;AF_TGP=0.00339;... |
| 5  | AF_ESP=0.40158;AF_EXAC=0.37025;AF_TGP=0.33886;... |
| 6  | ALLELEID=556509;CLNDISDB=MedGen:C4015293,OMIM:... |
| 7  | ALLELEID=556512;CLNDISDB=MedGen:C4015293,OMIM:... |
| 8  | ALLELEID=171289;CLNDISDB=MedGen:C4015293,OMIM:... |
| 9  | AF_EXAC=0.00001;ALLELEID=171288;CLNDISDB=MedGe... |
| 10 | AF_ESP=0.00038;AF_EXAC=0.00036;AF_TGP=0.00060;... |
| 11 | AF_ESP=0.00987;AF_EXAC=0.00772;AF_TGP=0.01558;... |
| 12 | AF_ESP=0.00070;AF_TGP=0.00080;ALLELEID=446981;... |
| 13 | AF_EXAC=0.00038;ALLELEID=446941;CLNDISDB=MedGe... |
| 14 | AF_EXAC=0.00114;AF_TGP=0.00958;ALLELEID=364282... |
| 15 | ALLELEID=556516;CLNDISDB=MedGen:C3808739,OMIM:... |
| 16 | AF_EXAC=0.00024;ALLELEID=364148;CLNDISDB=MedGe... |
| 17 | ALLELEID=514900;CLNDISDB=MedGen:C3808739,OMIM:... |
| 18 | AF_EXAC=0.42418;AF_TGP=0.28255;ALLELEID=133759... |
| 19 | ALLELEID=364285;CLNDISDB=MedGen:CN169374;CLNDN... |

【问题讨论】:

【参考方案1】:

想通了。效果很好,必须稍微清理一下结果并删除多余的空格和逗号。

def my_func(x):
    return  [value.split("CLNDISDB=",1) for value in x.split(';') if 'CLNDISDB' in value]

df['CLNDISDB'] = [my_func(x) for x in df['INFO'].values]

【讨论】:

【参考方案2】:

这很有趣,所以设置数据框

import re
import pandas as pd
import numpy as np

test='INFO':['AF_EXAC=0.42418;AF_TGP=-0.28255;ALLELEID=133759', 'foo','AF_EXAC=-0.42418;AF_TGP=0.28255;ALLELEID=133759']
df=pd.DataFrame(test)

我们得到

    INFO
0   AF_EXAC=0.42418;AF_TGP=-0.28255;ALLELEID=133759
1   foo
2   AF_EXAC=-0.42418;AF_TGP=0.28255;ALLELEID=133759

现在使用 lambda 函数和条件,我们只需提取“AF_TGP”的值。设置一个新列,我们从值周围的正则表达式模式中提取数字。但是我们只在它传递文本时运行正则表达式,使用 python 中的in 函数。

df['a'] = df['INFO'].apply(lambda x: re.search(r'AF_TGP=(?P<number>[+-]?\d+\.\d+);', str(x)).group('number') if 'AF_TGP' in str(x) else np.nan)

这给出了结果

    INFO                                            a
0   AF_EXAC=0.42418;AF_TGP=-0.28255;ALLELEID=133759 -0.28255
1   foo                                             NaN
2   AF_EXAC=-0.42418;AF_TGP=0.28255;ALLELEID=133759 0.28255

【讨论】:

以上是关于解析数据框列以获取子字符串并返回值的主要内容,如果未能解决你的问题,请参考以下文章

像 Prolog 一样统一数据框列以删除重复项

雪花 - 检查模式并返回该模式中的子字符串

熊猫数据框列上的子字符串

Pandas 通过子字符串匹配过滤数据框列

如何创建一个计算数据框列中 ID 频率的列?

通过引用字符串位置检查数据框列中的子字符串