You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cyvcf2遍历VCF文件时获取样本GT值的问题求助

问题:使用cyvcf2获取VCF样本GT值时出现AttributeError错误

我希望创建一个新的CSV文件,包含VCF文件中的部分行数据(chrom、pos、ref、alt以及各样本的GT值)。但在获取GT值时遇到问题:运行代码中注释的print语句时,抛出错误“AttributeError: 'cyvcf2.cyvcf2.Variant' object has no attribute 'samples'”,尽管我是参考pyvcf文档编写的这段代码。请问应该在vcf_records.append()中alt之后添加什么内容,才能获取所有样本的GT值?

原代码片段:

def foo(vcf_file, input_csv_file, output_csv_file, num_lines=10000):
    
    csv_df = pd.read_csv(input_csv_file, sep=';')
    
    vcf_reader = cyvcf2.VCF(vcf_file)
    total_records_vcf = num_lines
    
    vcf_records = []
    for i, vcf_record in tqdm(enumerate(vcf_reader), total=total_records_vcf):
        chrom = vcf_record.CHROM
        pos = vcf_record.POS
        ref = vcf_record.REF
        alt = vcf_record.ALT[0]
        for sample in vcf_record.samples:
            print(sample['GT']) #this throws an error: AttributeError: 'cyvcf2.cyvcf2.Variant' object has no attribute 'samples'

        vcf_records.append({'chrom': chrom, 'pos': pos, 'ref': ref, 'alt': alt, ...#here i need to add the GT values for all samples})

... rest of the code

解决方法

错误原因是混淆了pyvcf和cyvcf2的API,两者样本基因型的获取方式完全不同:cyvcf2的Variant对象没有samples属性,需用以下方式获取GT值:

  1. 通过vcf_reader.samples获取VCF文件中所有样本的名称列表
  2. 用vcf_record.genotypes获取每个样本的基因型数据,转换为标准GT字符串格式(如0/1)
  3. 将样本名称与对应GT值配对成字典,合并到记录中

修改后的代码片段:

def foo(vcf_file, input_csv_file, output_csv_file, num_lines=10000):
    csv_df = pd.read_csv(input_csv_file, sep=';')
    vcf_reader = cyvcf2.VCF(vcf_file)
    total_records_vcf = num_lines
    # 获取所有样本名称
    sample_names = vcf_reader.samples
    vcf_records = []
    
    for i, vcf_record in tqdm(enumerate(vcf_reader), total=total_records_vcf):
        if i >= num_lines:
            break  # 限制读取行数,避免超出设定值
        chrom = vcf_record.CHROM
        pos = vcf_record.POS
        ref = vcf_record.REF
        alt = vcf_record.ALT[0] if vcf_record.ALT else None
        
        # 转换基因型为"0/1"格式的字符串
        gt_strings = [f"{gt[0]}/{gt[1]}" for gt in vcf_record.genotypes]
        # 构建样本GT的键值对字典
        sample_gt_data = dict(zip(sample_names, gt_strings))
        
        # 合并基础字段和样本GT数据
        record = {
            'chrom': chrom,
            'pos': pos,
            'ref': ref,
            'alt': alt,
            **sample_gt_data  # 展开字典,将每个样本GT作为单独列
        }
        vcf_records.append(record)
    
    # 后续将记录转为DataFrame并保存为CSV
    result_df = pd.DataFrame(vcf_records)
    result_df.to_csv(output_csv_file, index=False)

关键说明

  • vcf_reader.samples:返回VCF文件头部定义的所有样本名称列表
  • vcf_record.genotypes:每个元素是一个元组,前两个值对应样本的两个等位基因索引(0代表参考序列REF,1代表第一个变异ALT,以此类推)
  • 使用**sample_gt_data可将每个样本的GT值作为单独列添加到CSV中,最终CSV会包含chrom、pos、ref、alt以及每个样本的GT列

内容的提问来源于stack exchange,提问作者barista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:45:30