2016-09-20 598 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