我有一个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