我有两个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.concat
或pandas.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
联接。如果我们只需要来自其中一个的数据,我们可以根据我们想要保留的内容使用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 可用于沿行轴或列轴扩展数据帧。假设 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 中处理数据的一个很好的介绍。