Merge df: 没有错误,但只输出 header 行
Merge df: no error, but output only header line
我正在尝试将一个可以放入内存的小数据帧 (dfSmall) 与一个无法放入内存的大数据帧 (dfLarge) 合并。它们都太大了 post 但看起来像:
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]
当我 运行 它时,我没有得到任何错误,但我的输出文件只有 header:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 ...
我已经手动检查了一些条目,所以我知道这两个文件中的行在 #CHROM
和 POS
列中在视觉上是匹配的。
我认为获取只有 header 的输出文件的问题可能是因为列数据类型不匹配,这就是我明确设置 dtype='str'
的原因。但是,检查 dfLarge 的数据类型给我 dtype('O')
,而不是 str
。由于数据类型不同,它们在 #CHROM/POS
列上可能不匹配吗?如果这不是问题,还有其他想法吗?
我认为您的问题出在您解析文件的方式上 - 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
我正在尝试将一个可以放入内存的小数据帧 (dfSmall) 与一个无法放入内存的大数据帧 (dfLarge) 合并。它们都太大了 post 但看起来像:
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]
当我 运行 它时,我没有得到任何错误,但我的输出文件只有 header:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 ...
我已经手动检查了一些条目,所以我知道这两个文件中的行在 #CHROM
和 POS
列中在视觉上是匹配的。
我认为获取只有 header 的输出文件的问题可能是因为列数据类型不匹配,这就是我明确设置 dtype='str'
的原因。但是,检查 dfLarge 的数据类型给我 dtype('O')
,而不是 str
。由于数据类型不同,它们在 #CHROM/POS
列上可能不匹配吗?如果这不是问题,还有其他想法吗?
我认为您的问题出在您解析文件的方式上 - 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