【问题标题】:Merge many tsv files by common key using Python pandas使用 Python pandas 通过公共键合并许多 tsv 文件
【发布时间】:2014-05-02 16:45:08
【问题描述】:

我有数百个具有两个字段的 tsv 文件,一个公共密钥和一个唯一的样本 id:

==> test1.vmat <==
CHROM:POS:REF:ALT  144-93-02
1:14653:C:T  1
1:14677:G:A  1
1:14907:A:G  1

==> test2.vmat <==
CHROM:POS:REF:ALT  144-93-01
1:14653:C:T  1
1:14522:G:A  1
1:14907:A:G  1

我想使用字段“CHR:POS:REF:ALT”对所有文件执行外连接,以形成一个巨大的矩阵。两个文件的示例:

CHROM:POS:REF:ALT  144-93-02    144-93-01
1:14653:C:T  1.0 1.0
1:14522:G:A  NA 1.0
1:14677:G:A  1.0 NA
1:14907:A:G  1.0 1.0

我使用下面的代码得到了上面的输出,但是我在遍历目录 (path/to/testN.vmat) 中的数百个 *tsv 文件时遇到了问题。如何将其修改为将目录中的所有单个 *tsv 文件合并为单个 tsv 文件的内容?

variant_field = "CHROM:POS:REF:ALT"
outfile = "everyone.vmat"

df1 = pandas.read_csv("path/to/test1.vmat", sep='\t', parse_dates=False)
df2 = pandas.read_csv("path/to/test2.vmat", sep='\t', parse_dates=False)

df3 = pandas.merge(df1,df2,on=variant_field, how='outer')
df3.to_csv(str(outfile), sep="\t", header=True, index=False, na_rep="NA", engine='python')

【问题讨论】:

    标签: python merge pandas tsv


    【解决方案1】:

    如果您将“CHROM:POS:REF:ALT”设为索引,则您将加入多个框架:

    df1 = pandas.read_csv("path/to/test1.vmat", sep='\t', parse_dates=False,
                                                index_col='CHROM:POS:REF:ALT')
    
    
    In [11]: df1.join([df2], how='outer')
    Out[11]: 
                 144-93-02  144-93-01
    1:14522:G:A        NaN          1
    1:14653:C:T          1          1
    1:14677:G:A          1        NaN
    1:14907:A:G          1          1
    

    在某些情况下,将其视为连接而不是连接更诚实:

    In [12]: pd.concat([df1, df2], axis=1)
    Out[12]: 
                 144-93-02  144-93-01
    1:14522:G:A        NaN          1
    1:14653:C:T          1          1
    1:14677:G:A          1        NaN
    1:14907:A:G          1          1
    

    您可以使用glob 遍历所有文件:

    from glob import iglob
    pd.concat((pd.read_csv(f, ...) for f in glob.iglob(*.vmat)), axis=1)
    

    【讨论】:

    • 很有趣,您所说的“更诚实地认为这是一个 concat”是什么意思?我一直认为连接只是将两个矩阵堆叠在一起
    • @alexhli 好问题,我说因为每个“帧”实际上只是最终结果中的一列,而不是更复杂的合并(每个帧都有几列)......主观不过要说的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2020-05-29
    • 2017-07-22
    • 2017-11-07
    • 2011-05-03
    相关资源
    最近更新 更多