【问题标题】:Merge two csv file in python在python中合并两个csv文件
【发布时间】:2017-02-03 18:22:50
【问题描述】:

我试图合并两个 csv 文件,我不想删除重复项,我只想检查第一列“PDB ID”,然后检查第二列“Chain 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

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    也许您可以使用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
    

    【讨论】:

    • 谢谢,实际上 file1 列 A“PDB ID”和 File2 列“PBD ID”的顺序不同。我已经编辑了上面的输入文件。我尝试了上面的代码,但得到了与输出相同的输入文件,因为两个文件列 A“PDB ID”的序列不同。
    • 我编辑了我的答案,它应该适用于这些未排序的“PDB ID”序列。它假设两个 DataFrame 具有相同的行数。
    • 谢谢,但出现错误:长度不匹配:预期轴有 3049 个元素,新值有 3060 个元素
    • 我相信这是指我在 DataFrame b 上设置索引的位置,这意味着 DataFrame a 比 DataFrame b 多 21 行,所以我假设行数相同是不正确。我找到了一个更简单的解决方案,所以我现在用它来更新我的帖子。
    猜你喜欢
    • 2020-03-18
    • 2012-08-12
    • 1970-01-01
    • 2019-03-27
    • 2013-04-22
    • 2020-11-22
    • 1970-01-01
    • 2020-08-22
    • 2017-09-14
    相关资源
    最近更新 更多