合并df:没有错误,但只输出标题行

Posted

技术标签:

【中文标题】合并df:没有错误,但只输出标题行【英文标题】:Merge df: no error, but output only header line 【发布时间】:2018-10-11 00:42:03 【问题描述】:

我正在尝试将可以放入内存的小型数据帧 (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     ...

我手动检查了一些条目,因此我知道两个文件中的某些行在 #CHROMPOS 列中都在视觉上匹配。

我认为获取只有标题的输出文件的问题可能是因为列数据类型不匹配,这就是我显式设置dtype='str'的原因。但是,检查 dfLarge 的 dtypes 给了我dtype('O'),而不是str。它们在#CHROM/POS 列上是否不匹配,因为dtypes 不同?如果这不是问题,还有其他想法吗?

【问题讨论】:

您能否为上面的示例添加精确的数据合并形式。 你的意思是输出文件?当然,补充!整篇文章有 2000 多列,所以我粘贴了前十来给出一个想法。 我的意思是 dfSmall 和 dfLarge 的两个摘录的合并形式。可以尝试从代码中找出您想要实现的目标,但看一下您是否正确地编写了您的意图并不清楚。 哦,好吧,我更新了所有内容,使其看起来更像我的真实数据,然后举例说明该子集的输出应该是什么。 这看起来更好。可以添加列名和索引名吗? 【参考方案1】:

我认为您的问题来自您解析文件的方式 - 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  

【讨论】:

哇,是的,我已经习惯了read_csv,以至于我没有sep=',' 太棒了!我很高兴它被排序了。

以上是关于合并df:没有错误,但只输出标题行的主要内容,如果未能解决你的问题,请参考以下文章

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

pandas - 合并字符串列不起作用(错误?)

如何并排合并两个数据框?

如何在有重复的列上合并两个 DataFrame,并输出没有重复的行

df.join() 出现问题:ValueError:您正在尝试合并对象和 int64 列

有没有办法从 Powershell 抑制所有命令行输出,包括错误