使用Python pandas通过公共键合并多个tsv文件

1 投票
1 回答
2790 浏览
提问于 2025-04-17 23:45

我有几百个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

我用下面的代码得到了上面的输出,但我在处理目录里几百个*tsv文件时遇到了麻烦(路径是path/to/testN.vmat)。我该如何修改这个代码,让它能把目录下所有的*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')

1 个回答

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)

撰写回答