从包含不规则结构的";"和"|"分隔符的列中提取信息



我有一个pandas数据帧,其中一列如下所示。

INFO
SVTYPE=CNV;END=401233
SVTYPE=CNV;END=401233;CSQT=1|BHAT12|ESNT12345|
SVTYPE=CNV;END=401233;CSQT=1|JHV87|ESNT12345|,1|HJJUB2|ESNT12345|
SVTYPE=CNV;END=401233;CSQT=1|GFTREF|ESNT12345|,1|321lkj|ESNT12345|,1|16-YHGT|ESNT12345|...

我想在新列中提取的信息是gene|ESNT12345。同样的例子应该是

gene1               gene2               gene3
Na                  Na                  Na
BHAT12|ESNT12345 Na                  Na
JHV87|ESNT12345 HJJUB2|ESNT12345 Na
GFTREF|ESNT12345 321lkj|ESNT12345 16-YHGT|ESNT12345

我怎么能和熊猫一起工作呢?我一直在试用.apply(lambda x:x.split("|")。但由于我不知道我的数据集有gene_name|ESNT12345的数量,而且这将用于一个需要数千个不同数据帧的应用程序,我正在寻找一种动态创建必要列的方法。

我该怎么做?

IIUC,您可以使用正则表达式和str.extractall

连接到原始数据:

new_df = df.join(
df['INFO']
.str.extractall(r'(w+|ESNTd+)')[0]
.unstack(level='match')
.add_prefix('gene_')
)

输出:

                   INFO            gene_0            gene_1          gene_2
0                                                                       SVTYPE=CNV;END=401233               NaN               NaN             NaN
1                                              SVTYPE=CNV;END=401233;CSQT=1|BHAT12|ESNT12345|  BHAT12|ESNT12345               NaN             NaN
2                           SVTYPE=CNV;END=401233;CSQT=1|JHV87|ESNT12345|,1|HJJUB2|ESNT12345|   JHV87|ESNT12345  HJJUB2|ESNT12345             NaN
3  SVTYPE=CNV;END=401233;CSQT=1|GFTREF|ESNT12345|,1|321lkj|ESNT12345|,1|16-YHGT|ESNT12345|...  GFTREF|ESNT12345  321lkj|ESNT12345  YHGT|ESNT12345

而不连接到原始数据:

new_df = (df['INFO']
.str.extractall(r'(w+|ESNTd+)')[0]
.unstack(level='match')
.add_prefix('gene_')
.reindex(df.index)
)

输出:

match            gene_0            gene_1          gene_2
0                   NaN               NaN             NaN
1      BHAT12|ESNT12345               NaN             NaN
2       JHV87|ESNT12345  HJJUB2|ESNT12345             NaN
3      GFTREF|ESNT12345  321lkj|ESNT12345  YHGT|ESNT12345
regex破解到有gene1,gene2…

如果你真的想让基因计数器以1开头,你可以使用这个小的regex破解(将字符串的开头匹配为match0并将其删除(:

new_df = (df['INFO']
.str.extractall(r'(^|w+|ESNTd+)')[0]
.unstack(level='match')
.iloc[:, 1:]
.add_prefix('gene')
.reindex(df.index)
)

输出:

match             gene1             gene2           gene3
0                   NaN               NaN             NaN
1      BHAT12|ESNT12345               NaN             NaN
2       JHV87|ESNT12345  HJJUB2|ESNT12345             NaN
3      GFTREF|ESNT12345  321lkj|ESNT12345  YHGT|ESNT12345

相关内容

最新更新