python-3.x - 解析数据框列以获取子字符串并返回值
问题描述
我有一个名为“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... |
解决方案
这很有趣,所以设置数据框
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”的值。设置一个新列,我们从围绕该值的正则表达式模式中提取数字。但是我们只在它传递文本时运行正则表达式,使用in
python中的函数。
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
推荐阅读
- html - 居中 div, margin: 0 auto; 不工作
- python - TypeError:无法在“文档”上执行“评估”:结果不是节点集,因此无法通过 Selenium 使用 Xpath 进行转换
- javascript - 通过 JavaScript 查找相似层次结构的元素(用于网页抓取)
- java - 在运行时通过 Java 创建 XML 文件的问题
- video - 如何停止将视频流中的最后一帧作为使用 ffmpeg 编码的 mp4 容器的一部分?
- python - 通过在 matplotlib 中使用轴来增加刻度大小
- javascript - 使用 ytdb-core 播放视频时获取视频的当前时间戳
- python - 如何在kivy中动态添加项目到滚动视图
- scala - sbt-crossproject 插件能否支持两个具有两个独立主类的 Scala.js 构建,两者的输出都由 scalajs-bundler 插件管理?
- sql - 员工排班系统