将列从一个tsv文件追加到另一个(unix)

时间:2017-04-06 15:00:21

标签: python bash unix

我有两个tsv文件,每个文件都有标题和列。文件A包含标题:SampleID& RawReads,FileB有标题:SampleID& ReadsPost。我想将ReadsPost附加到FileA,以便数据与正确的SampleID对齐。

我最初的计划是在python中使用字典作为sampleID来执行此操作。但是,在bash中必须有一个更简单的方法来做到这一点!

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:0)

使用pandas.read_csv加载数据,您可能需要为制表符分隔的工作表设置sep='\t'。加载两个DataFrame后,您可以使用pandas.concatpandas.merge。有关参考,请参阅Pandas文档中的Merge, join, and concatenate

让我们说你的两个tsv'看起来像这样:

文件1:

SampleID     RawReads
1            18
2            15      
5            21    
7            7    

file2的:

SampleID     ReadsPost
1            yes
3            no
4            yes
5            yes

使用合并

Merge可用于在两个DataFrame上实现数据库样式连接。在我们的例子中,我们可以看到两个DataFrame在SampleID列中不一致。如果我们想确保从两个帧中获取所有数据,我们将使用outer连接。如果我们只需要来自其中一个的数据,我们可以使用rightleft联接,具体取决于我们想要保留的内容。以下是保留所有内容的示例。

df1 = pd.read_csv(file1, sep='\t')
df2 = pd.read_csv(file2, sep='\t')
merge_df = pd.merge(df1, df2, how='outer', on='SampleID')
print(merge_df)
   SampleID  RawReads ReadsPost
0         1      18.0       yes
1         2      15.0       NaN
2         5      21.0       yes
3         7       7.0       NaN
4         3       NaN        no
5         4       NaN       yes

使用Concat

Concat可用于沿行轴或列轴扩展DataFrame。假设SampleID是您的索引,您只是想沿着列轴将file2中的值连接到file1。例如:

df1 = pd.read_csv(file1, sep='\t', index_col='SampleID')
df2 = pd.read_csv(file2, sep='\t', index_col='SampleID')
concat_df = pd.concat([df1, df2], axis=1)
print(concat_df)
          RawReads ReadsPost
SampleID
1             18.0       yes
2             15.0       NaN
3              NaN        no
4              NaN       yes
5             21.0       yes
7              7.0       NaN

就像我说的阅读Pandas文档一样。它是一个非常强大的库,也是在python中处理数据的一个很好的介绍。

答案 1 :(得分:0)

使用join并进行完全外部联接:

>cat test.txt test2.txt
SampleID  RawReads
1         18
2         15
5         21
7         7
SampleID     ReadsPost
1            yes
3            no
4            yes
5            yes

> join -a1 -a2 test.txt test2.txt
SampleID RawReads ReadsPost
1 18 yes
2 15
3 no
4 yes
5 21 yes
7 7

注意:-a参数打印文件中未连接的行。要进行完全外部连接,请从两个文件中打印行,如图所示。