如何在Pandas中从DataFrame的INFO列提取AC对应数值
提取Pandas DataFrame中INFO列的AC数值解决方案
问题说明
现有如下结构的Pandas DataFrame:
#CHROM POS INFO chr1 111 AC=0;AN=33 chr1 111 AC=0;AN=100 chr1 111 AC=110;AN=51 chr2 737 AC=99;AN=10003 chr2 888 AC=100;AN=1636
需要新增number列,提取INFO列中AC=N格式里的数值N,最终输出如下:
#CHROM POS INFO number chr1 111 AC=0;AN=33 0 chr1 111 AC=0;AN=100 0 chr1 111 AC=110;AN=51 110 chr2 737 AC=99;AN=10003 99 chr2 888 AC=100;AN=1636 100
解决思路
方法1:正则表达式提取(推荐,适配性强)
用Pandas的str.extract方法,通过正则精准匹配AC=后面的数字:
import pandas as pd # 假设原始DataFrame为df df['number'] = df['INFO'].str.extract(r'AC=(\d+)', expand=False).astype(int)
- 正则
r'AC=(\d+)'的作用是匹配AC=开头的片段,捕获后面的所有数字; astype(int)把提取到的字符串转成整数类型,方便后续数值运算。
方法2:字符串分割法(格式固定时适用)
如果INFO列的格式稳定(AC始终在分号前),可以用两次分割提取数值:
df['number'] = df['INFO'].str.split(';').str[0].str.split('=').str[1].astype(int)
- 先按
;分割字符串,取第一个片段(也就是AC=N部分); - 再按
=分割,取第二个元素就是需要的数值。
方法3:自定义函数+apply(灵活处理复杂格式)
如果INFO列里AC的位置不固定(比如有时候在AN后面),可以写个自定义函数遍历片段:
def extract_ac(info_str): for segment in info_str.split(';'): if segment.startswith('AC='): return int(segment.split('=')[1]) df['number'] = df['INFO'].apply(extract_ac)
- 这个方法会逐个检查
INFO分割后的每个片段,找到以AC=开头的部分再提取数值,容错性更强。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

