在python中合并两个csv文件

时间:2016-09-20 12:10:58

标签: 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", 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

1 个答案:

答案 0 :(得分: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