我有两个tsv文件,每个文件都有标题和列。文件A包含标题:SampleID& RawReads,FileB有标题:SampleID& ReadsPost。我想将ReadsPost附加到FileA,以便数据与正确的SampleID对齐。
我最初的计划是在python中使用字典作为sampleID来执行此操作。但是,在bash中必须有一个更简单的方法来做到这一点!
任何帮助都会很棒!
答案 0 :(得分:0)
使用pandas.read_csv
加载数据,您可能需要为制表符分隔的工作表设置sep='\t'
。加载两个DataFrame后,您可以使用pandas.concat
或pandas.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
连接。如果我们只需要来自其中一个的数据,我们可以使用right
或left
联接,具体取决于我们想要保留的内容。以下是保留所有内容的示例。
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参数打印文件中未连接的行。要进行完全外部连接,请从两个文件中打印行,如图所示。