Объединить df: без ошибок, но вывести только строку заголовка - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь объединить небольшой фрейм данных (dfSmall), который может уместиться в памяти, с огромным фреймом данных (dfLarge), который не умещается в памяти. Они оба слишком велики, чтобы оставлять здесь сообщения, но выглядят примерно так:

dfSmall:
ix,#CHROM,POS,sample,allele,pop,super_pop
0,1,1121557,rs112904239,HG00096,T,GBR,EUR
1,1,1213223,rs113095492,HG00096,T,GBR,EUR
2,1,1000894,rs114006445,HG00096,T,GBR,EUR
(5000 rows)

dfLarge:
#CHROM POS      ID          REF ALT QUAL FILTER
1      14719    rs527865771 C   A   100 PASS   ...
1      14728    rs547701710 C   A   100 PASS   ...
1      1213223  rs113095492 A   G   100 PASS   ...
...
(>1 million rows, >2000 columns)

#for just these three rows, my output would the row where 1, 1213223 match:
dfMerge:
#CHROM POS      ID          REF ALT QUAL FILTER
  1    1213223  rs113095492 A   G   100  PASS

Вот мой код:

dfSmall = pd.read_table('small.csv', dtype='str', header=None, skiprows=1, names=['ix', '#CHROM', 'POS', 'ID', 'sample', 'allele', 'pop', 'superpop'])

def merge_it(c):
        return dfSmall.merge(c, on=['#CHROM', 'POS'], suffixes=('', '_y'))[header_line]

dfFull = pd.concat([merge_it(c) for c in pd.read_table(large.vcf.gz, header = None, names = header_line, dtype='str', engine = 'c',compression = 'gzip', skiprows=251, chunksize=40000, low_memory=False)])

match = re.search(r'ALL.(chr\d+)', chromosome)
dfFull.to_csv(r"{}.csv".format(match.group(1)))

где header_line = ['#CHROM','POS','ID','REF','ALT','QUAL','FILTER',..., 2500 strings]

Когда я запускаю его, я не получаю ошибок, но мой выходной файл - только заголовок:

#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  HG00096 HG00097 HG00099 HG00100 HG00101 HG00102     ...

Я вручную проверил несколько записей, поэтому я знаю, что в обоих файлах есть строки, которые визуально совпадают в столбцах #CHROM и POS.

Я думал, что проблема получения выходного файла только с заголовком может заключаться в том, что типы данных столбца не совпадают, поэтому я явно установил dtype='str'. Однако проверка dtypes для dfLarge дает мне dtype('O'), а не str. Могут ли они не соответствовать столбцам #CHROM/POS, потому что типы dtypes разные? Если это не проблема, есть другие идеи?

1 Ответ

0 голосов
/ 01 мая 2018

Я думаю, что ваша проблема связана с тем, как вы анализируете файл - в dfSmall есть запятые. Вот что я получу после удаления запятых:

df_m = pd.merge(dfSmall, dfLarge, on=['POS', 'CHROM'], how='inner')


dfSmall
Out[100]: 
   CHROM      POS       sample   allele pop super pop.1
0      1  1121557  rs112904239  HG00096   T   GBR   EUR
1      1  1213223  rs113095492  HG00096   T   GBR   EUR
2      1  1000894  rs114006445  HG00096   T   GBR   EUR

dfLarge
Out[102]: 
   CHROM      POS           ID REF ALT  QUAL FILTER
0      1    14719  rs527865771   C   A   100   PASS
1      1    14728  rs547701710   C   A   100   PASS
2      1  1213223  rs113095492   A   G   100   PASS

df_m
Out[103]: 
   CHROM      POS       sample   allele pop super pop.1           ID REF ALT  \
0      1  1213223  rs113095492  HG00096   T   GBR   EUR  rs113095492   A   G   

   QUAL FILTER  
0   100   PASS  
...