2017-04-06 119 views
0

我有兩個tsv文件,每個文件都有標題和列。文件A具有標題:SampleID & RawReads,FileB具有標題:SampleID & ReadsPost。我想將ReadsPost附加到FileA,以便數據與正確的SampleID對齊。將列從一個tsv文件添加到另一個(unix)

我原來的計劃是在Python中使用字典來完成此操作,其中鍵是sampleID。但是,在bash中必須有一個更簡單的方法來做到這一點!

任何幫助將是偉大的!

+0

謝謝!兩個答案都很完美。我使用了熊貓選項,因此我可以用Rawpads和ReadsPost與matplotlib構建一個分組條形圖。 –

回答

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參數打印線。爲了完成一個完整的外連接,從兩個文件中打印行,如示例所示。

0

使用pandas.read_csv加載您的數據,您可能必須爲製表符分隔的工作表設置sep='\t'。一旦你有兩個DataFrames加載,你可以使用pandas.concatpandas.merge。請參閱Pandas文檔中的Merge, join, and concatenate

比方說,你的兩個TSV」是這樣的:

文件1:

SampleID  RawReads 
1   18 
2   15  
5   21  
7   7  

文件2:

SampleID  ReadsPost 
1   yes 
3   no 
4   yes 
5   yes 

使用合併

合併可以被用來實現兩個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 

使用的毗連

的毗連可用於沿任行或列軸線延伸DataFrames。假設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中處理數據的好工具。

相關問題