我试图合并两个csv文件,我不想删除重复我只想检查第一列“PDB ID”,然后检查第二列“链ID”。所有值都有输入文件。我想合并并添加列文件1和文件2.
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 :(得分:0)
也许您可以使用pandas merge
方法的left_index
和right_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
这是一个更简单的解决方案,如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