.vcf данные в pandas dataframe

Как я могу преобразовать следующие данные .vcf в фреймворк pandas?

Ссылка GDrive на файл .txt

В идеале хотелось бы в виде:

Пока мне удалось получить только заголовки:

      import pandas as pd

f = open('clinvar_final.txt',"r")

for line in f.readlines():
    if line[:5] == 'CHROM':
        vcf_header = line.strip().split('\t')

df = pd.DataFrame
df.header = vcf_header

4 ответа

Нет необходимости читать построчно.

У панд есть опция под названиемcommentкоторый можно использовать для пропуска нежелательных строк.

Вы можете напрямую загружать файлы VCF в pandas, выполнив следующую строку.

      In [9]: pd.read_csv('clinvar_final.txt', sep="\t", comment='#')
Out[9]: 
        CHROM        POS      ID REF ALT FILTER QUAL                                               INFO
0           1    1014O42  475283   G   A      .    .  AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619;...
1           1    1O14122  542074   C   T      .    .  AF_ESP=0.00015;AF_EXAC=0.00010;ALLELEID=514926...
2           1    1014143  183381   C   T      .    .  ALLELEID=181485;CLNDISDB=MedGen:C4015293,OMIM:...
3           1    1014179  542075   C   T      .    .  ALLELEID=514896;CLNDISDB=MedGen:C4015293,OMIM:...
4           1    1014217  475278   C   T      .    .  AF_ESP=0.00515;AF_EXAC=0.00831;AF_TGP=0.00339;...
...       ...        ...     ...  ..  ..    ...  ...                                                ...
102316      3  179210507  403908   A   G      .    .  ALLELEID=393412;CLNDISDB=MedGen:C0018553,Orpha...
102317      3  179210511  526648   T   C      .    .  ALLELEID=519163;CLNDISDB=MedGen:C0018553,Orpha...
102318      3  179210515  526640   A   C      .    .  AF_EXAC=0.00002;ALLELEID=519178;CLNDISDB=MedGe...
102319      3  179210516  246681   A   G      .    .  AF_EXAC=0.00001;ALLELEID=245287;CLNDISDB=MedGe...
102320      3  179210538  259958   A   T      .    .  AF_EXAC=0.00001;ALLELEID=251013;CLNDISDB=MedGe...

GATK Variantstotable — это то, что вам нужно, чтобы избежать каких-либо проблем благодаря гибкости формата VCF. Затем, имея CSV, импортируйте его в pandas. Я бы сказал, что это самый надежный способ сделать это.

https://gatk.broadinstitute.org/hc/en-us/articles/360036896892-VariantsToTable

Простая функция:

      import io
import os
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'})

Берет файл VCF, удаляет строки метаданных и преобразует оставшиеся данные в DataFrame Pandas с применением определенных типов данных столбцов и переименованием.

import pandas as pd with open(filename, "r") as f: lines = f.readlines() chrom_index = [i for i, line in enumerate(lines) if line.strip().startswith("#CHROM")] data = lines[chrom_index[0]:]
header = data[0].strip().split("\t") informations = [d.strip().split("\t") for d in data[1:]]

vcf = pd.DataFrame(информация, столбцы = заголовок)

Другие вопросы по тегам