[Python] VCF 파일을 데이터프레임(DataFrame)으로

반응형

 

VCF파일의 구조에 대해서 아래의 글에서 알아보았습니다.

[생물정보학] - VCF 파일 포맷: 변이 정보를 담은 포맷

 

VCF 파일을 Input으로 데이터 정제를 하는데 주로 python이 많이 사용됩니다. 이때 VCF파일을 pandas 라이브러리의 DataFrame 형태로 읽어올 수 있습니다. 그러면 엑셀이나 tsv, csv로 내보낼 수도 있고, pandas 라이브러리를 이용해 VCF파일을 정제할 수 있습니다.

 

* VCF파일을 DataFrame으로 가져오는 python 코드

import io
import pandas as pd

def read_vcf(path):
    with open(path, 'r') as f:
        lines = [l for l in f if not l.startswith('##')]
    return pd.read_csv(
        io.StringIO(''.join(lines)),
        dtype={'#CHROM': str, 'POS': int, 'ID': str, 'REF': str, 'ALT': str,
               'QUAL': str, 'FILTER': str, 'INFO': str},
        sep='\t'
    ).rename(columns={'#CHROM': 'CHROM'})

* 출력

test.vcf에 read_vcf 함수 적용

 

* 코드 설명

 path에는 vcf파일의 경로가 입력됩니다. 현재 경로에 vcf파일이 있다면, 위의 출력처럼 path에 'test.vcf'를 줘도 됩니다.

open()함수를 이용해서 파일을 읽어오고, ##으로 시작하는 메타 정보 부분을 제외하여 파일의 각 줄을 리스트형태로 lines에 저장합니다.

with open(path, 'r') as f:
    lines = [l for l in f if not l.startswith('##')]

 

위에서 읽어온 lines는 아래와 같은 리스트입니다.

lines 형태

''.join(lines)를 이용해 모두 이어 붙여 string형태로 만든뒤에, io.StringIO를 이용하여 파일 형태로 만들어줍니다.

그 후, dtype을 이용해 VCF파일의 필수 8개의 열에 대해, 데이터 형식을 지정해 줍니다. (그 외의 열에 대해선 값들을 보고 pandas가 자동으로 지정해줍니다.)

첫 번째 열인 CHROM에는 #이 주석으로 붙어있기 때문에 rename함수를 이용해 이 부분을 '#CHROM'에서 'CHROM'으로 바꿔줍니다.

pd.read_csv(
        io.StringIO(''.join(lines)),
        dtype={'#CHROM': str, 'POS': int, 'ID': str, 'REF': str, 'ALT': str,
               'QUAL': str, 'FILTER': str, 'INFO': str},
        sep='\t'
    ).rename(columns={'#CHROM': 'CHROM'})

 

 

Reference)

python code: https://gist.github.com/dceoy/99d976a2c01e7f0ba1c813778f9db744

 

반응형

댓글

Designed by JB FACTORY