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



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

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

任何帮助都会很棒!

使用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 参数打印文件中未连接的行。若要执行完全外部联接,请打印两个文件中的行,如例所示。

使用pandas.read_csv加载数据,您可能需要为制表符分隔的工作表设置sep='t'。加载两个数据帧后,可以使用pandas.concatpandas.merge。有关良好的参考,请参阅 Pandas 文档中的合并、连接和连接。

假设您的两个 tsv' 看起来像这样:

文件 1:

SampleID     RawReads
1            18
2            15      
5            21    
7            7    

文件2:

SampleID     ReadsPost
1            yes
3            no
4            yes
5            yes

使用合并

合并可用于在两个数据帧上实现数据库样式联接。在我们的例子中,我们可以看到两个数据帧在 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 可用于沿行轴或列轴扩展数据帧。假设 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

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

最新更新