2016-09-20 214 views
1

我試圖合併兩個csv文件,我不想刪除重複我只想檢查第一列「PDB ID」,然後檢查第二列「Chain ID」。所有值都有輸入文件。我想合併並添加列文件1和文件2.合併python中的兩個csv文件

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
merged = a.merge(b, on='PDB ID') 
merged.to_csv("output.csv", index=False) 

我用上面的腳本,但得到的結果一行三次相同的值。

File 1: Input 
PDB ID Chain ID Ligand ID Uniprot Acc 
3RSQ A NAI Q9X024 
3RTD A NAI Q9X024 
1E3E A NAI Q9QYY9 
1E3E B NAI Q9QYY9 
1E3I A NAI Q9QYY9 
1E3I B NAI Q9QYY9 

File 2: Input 
PDB ID Chain ID Avg 
1E3E A 31.566 
1E3E B 17.867 
3RSQ A 57.653 
1E3I A 27.63 
1E3I B 17.867 
3RTD A 48.806 

Getting Output: 
PDB ID Chain ID_x Avg Ligand ID Uniprot Acc 
3RSQ A 57.653 NAI Q9X024 
3RTD A 48.806 NAI Q9X024 
1E3E A 31.566 NAI Q9QYY9 
1E3E A 31.566 NAI Q9QYY9 
1E3E B 17.867 NAI Q9QYY9 
1E3E B 17.867 NAI Q9QYY9 
1E3I A 27.63 NAI Q9QYY9 
1E3I A 27.63 NAI Q9QYY9 
1E3I B 17.867 NAI Q9QYY9 
1E3I B 17.867 NAI Q9QYY9 


Expected Output: 

3RSQ A 57.653 NAI Q9X024 
3RTD A 48.806 NAI Q9X024 
1E3E A 31.566 NAI Q9QYY9 
1E3E B 17.867 NAI Q9QYY9 
1E3I A 27.63 NAI Q9QYY9 
1E3I B 17.867 NAI Q9QYY9 

回答

0

也許你可以使用pandas merge方法left_indexright_index參數不重複的行。此外,使用this solution不重複的列名,我建議如下:

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
cols = b.columns.difference(a.columns) 
merged = a.merge(b[cols], left_index=True, right_index=True) 
merged.to_csv("output.csv", index=False) 

這就造成了這一點:

Chain ID Ligand ID PDB ID Uniprot Acc  Avg 
0  A  NAI 3RSQ  Q9X024 57.653 
1  A  NAI 3RTD  Q9X024 48.806 
2  A  NAI 1E3E  Q9QYY9 31.566 
3  B  NAI 1E3E  Q9QYY9 17.867 
4  A  NAI 1E3I  Q9QYY9 21.63 
5  B  NAI 1E3I  Q9QYY9 17.867 

編輯:

爲了做到這一點,當每個DataFrame的索引不對應相同PDB ID,我最終排序DataFrame a檢索其索引並設置指標將DataFrame b的排序版本轉換爲這些值。最後,我按其索引對DataFrame b進行排序,並且PDB ID應按照與DataFrame a相同的方式排序。

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
b = b.sort_values(by='PDB ID') 
b.index = a.sort_values(by='PDB ID').index 
b = b.sort_index() 
cols = b.columns.difference(a.columns) 
merged = a.merge(b[cols], left_index=True, right_index=True) 
merged.to_csv("output.csv", index=False) 

其中合併導致了這一點:

Chain ID Ligand ID PDB ID Uniprot Acc  Avg 
0  A  NAI 3RSQ  Q9X024 57.653 
1  A  NAI 3RTD  Q9X024 48.806 
2  A  NAI 1E3E  Q9QYY9 31.566 
3  B  NAI 1E3E  Q9QYY9 17.867 
4  A  NAI 1E3I  Q9QYY9 27.63 
5  B  NAI 1E3I  Q9QYY9 17.867 

編輯2:

這裏是一個更簡單的解決方案,爲this answer找到。

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
merged = a.merge(b, on=['PDB ID', 'Chain ID'], how='outer') 
merged.to_csv("output.csv", index=False) 

的行數不必相等,其結果應該是你所期望的(我的最後一排是不同的行數的例子):

Chain ID Ligand ID PDB ID Uniprot Acc  Avg 
0  A  NAI 3RSQ  Q9X024 57.653 
1  A  NAI 3RTD  Q9X024 48.806 
2  A  NAI 1E3E  Q9QYY9 31.566 
3  B  NAI 1E3E  Q9QYY9 17.867 
4  A  NAI 1E3I  Q9QYY9 27.63 
5  B  NAI 1E3I  Q9QYY9 17.867 
6  a   a  a   a  NaN 
+0

謝謝,其實文件1列「PDB ID」和File2列「PBD ID」不是相同的序列。我已經編輯過上面的輸入文件。我試過上面的代碼,但得到相同的輸入文件作爲輸出,因爲兩個文件列A「PDB ID」是不同的序列。 – krish

+0

我編輯了我的答案,它應該適用於這些未排序的「PDB ID」序列。它假定兩個DataFrame具有相同的行數。 – PyNoob

+0

謝謝,但得到錯誤:長度不匹配:期望軸有3049個元素,新值有3060個元素 – krish