在python中合并两个csv文件

在python中合并两个csv文件,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我试图合并两个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", ind

我试图合并两个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

也许您可以使用方法的
left\u index
right\u index
参数来避免重复行。此外,为了避免列名重复,我建议如下:

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
    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

编辑: 为了在每个数据帧的索引不对应于相同的
PDB ID
时实现这一点,我对数据帧
a
进行排序以检索其索引,并将数据帧
b
的排序版本的索引设置为这些值。最后,我按索引对数据帧
b
进行排序,并且
PDB ID
的排序方式应与数据帧
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   21.63
5        B       NAI   1E3I      Q9QYY9  17.867
    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: 这里有一个更简单的解决方案,如中所示

行数不必相等,结果应该是您期望的(我的最后一行是不同行数的示例):


也许您可以使用方法的
left\u index
right\u index
参数来避免重复行。此外,为了避免列名重复,我建议如下:

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
    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

编辑: 为了在每个数据帧的索引不对应于相同的
PDB ID
时实现这一点,我对数据帧
a
进行排序以检索其索引,并将数据帧
b
的排序版本的索引设置为这些值。最后,我按索引对数据帧
b
进行排序,并且
PDB ID
的排序方式应与数据帧
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   21.63
5        B       NAI   1E3I      Q9QYY9  17.867
    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: 这里有一个更简单的解决方案,如中所示

行数不必相等,结果应该是您期望的(我的最后一行是不同行数的示例):


谢谢,实际上file1列A“PDB ID”和File2列“PBD ID”的顺序不同。我已经编辑了上面的输入文件。我尝试了上面的代码,但得到了与输出相同的输入文件,因为两个文件列A“PDB ID”的序列不同。我编辑了我的答案,它应该适用于这些未排序的“PDB ID”序列。它假设两个数据帧具有相同的行数。谢谢,但出现了错误:长度不匹配:预期轴有3049个元素,新值有3060个元素。我相信这是指我在数据帧
b
上设置索引的位置,这意味着数据帧
a
比数据帧
b
多21行,因此我假设的行数相同是不正确的。我找到了一个更简单的解决方案,所以我现在用它更新我的帖子。谢谢,实际上file1列a“PDB ID”和File2列“PBD ID”的顺序不一样。我已经编辑了上面的输入文件。我尝试了上面的代码,但得到了与输出相同的输入文件,因为两个文件列A“PDB ID”的序列不同。我编辑了我的答案,它应该适用于这些未排序的“PDB ID”序列。它假设两个数据帧具有相同的行数。谢谢,但出现了错误:长度不匹配:预期轴有3049个元素,新值有3060个元素。我相信这是指我在数据帧
b
上设置索引的位置,这意味着数据帧
a
比数据帧
b
多21行,因此我假设的行数相同是不正确的。我找到了一个更简单的解决方案,所以我现在用它更新我的帖子。