1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

[Python] Merging Pandas dataframes on column combinations

Discussão em 'Python' iniciado por Stack, Setembro 17, 2025.

  1. Stack

    Stack Membro Participativo

    Scenario: I am trying to merge 2 pandas dataframes. DF1 has the bulk data, and DF2 is a sort of mapping. Based on the combination of the values of 3 different columns, I want to put a column from DF2 into DF1.

    Data sample (just a snippet of both dfs): DF1:

    +-------+---------------------------------------------+---------------------------------------------+------+----------------+----------------+
    | AGENT | 5283 | 5288 | 5318 | 7934 | 7935 |
    +-------+---------------------------------------------+---------------------------------------------+------+----------------+----------------+
    | 33 | No | No | No | No | No |
    | 34 | Yes, formal discussion | General reference | No | No | No |
    | 55 | No | No | No | No | No |
    | 129 | No | No | No | No | No |
    | 307 | No | No | No | No | No |
    | 441 | Yes, formal discussion | Formal board consideration | No | No | No |
    | 522 | Yes, specific reference but limited details | Formal board commtment with limited details | No | Not Meaningful | Not Meaningful |
    | 690 | No | No | No | Not Meaningful | Not Meaningful |
    | 749 | Yes, formal discussion | General reference | No | No | No |
    | 1011 | No | No | No | No | No |
    | 1067 | Yes, formal discussion | Formal board consideration | No | Not Meaningful | Not Meaningful |
    | 1272 | No | No | No | Not Meaningful | Not Meaningful |
    | 1592 | No | No | No | Not Meaningful | Not Meaningful |
    | 1908 | Yes, formal discussion | Formal board commtment with limited details | No | No | No |
    | 1949 | No | No | No | Not Meaningful | Not Meaningful |
    | 2040 | Yes, formal discussion | Formal board consideration | No | No | No |
    | 2102 | Yes, formal discussion | Formal board consideration | No | No | No |
    | 2114 | Yes, formal discussion | Formal board consideration | No | Not Meaningful | Not Meaningful |
    | 2266 | Yes, formal discussion | Formal board commtment with limited details | No | No | No |
    | 2365 | Yes, formal discussion | Formal board consideration | No | No | No |
    | 2674 | Yes, formal discussion | Formal board consideration | No | No | No |
    | 3109 | No | General reference | No | No | No |
    | 3170 | Yes, specific reference but limited details | Formal board commtment with limited details | No | Not Meaningful | Not Meaningful |
    | 3295 | Yes, specific reference but limited details | Formal board commtment with limited details | No | No | No |
    | 3323 | General reference | General reference | No | Not Meaningful | Not Meaningful |
    | 3366 | Yes, specific reference but limited details | Formal board consideration | No | No | No |
    | 3840 | General reference | Formal board commtment with limited details | No | No | No |
    | 3914 | Yes, specific reference but limited details | Formal board commtment with limited details | No | No | No |
    | 3967 | Yes, formal discussion | Formal board consideration | No | Yes | No |
    | 4108 | No | No | No | No | No |
    +-------+---------------------------------------------+---------------------------------------------+------+----------------+----------------+


    DF2:

    +---------------------------------------------+---------------------------------------------+------+-------+
    | 5283 | 5288 | 5318 | SCORE |
    +---------------------------------------------+---------------------------------------------+------+-------+
    | Yes, formal discussion | Formal board consideration | Yes | 10 |
    | Yes, formal discussion | Formal board consideration | No | 8 |
    | Yes, formal discussion | Formal board commtment with limited details | Yes | 7 |
    | Yes, formal discussion | Formal board commtment with limited details | No | 6 |
    | Yes, formal discussion | General reference | Yes | 6 |
    | Yes, formal discussion | General reference | No | 5 |
    | Yes, formal discussion | No specific reference | Yes | 4 |
    | Yes, formal discussion | No specific reference | No | 2 |
    | Yes, specific reference but limited details | Formal board consideration | Yes | 8 |
    | Yes, specific reference but limited details | Formal board consideration | No | 7 |
    | Yes, specific reference but limited details | Formal board commtment with limited details | Yes | 6 |
    | Yes, specific reference but limited details | Formal board commtment with limited details | No | 5 |
    | Yes, specific reference but limited details | General reference | Yes | 5 |
    | Yes, specific reference but limited details | General reference | No | 5 |
    | Yes, specific reference but limited details | No specific reference | Yes | 3 |
    | Yes, specific reference but limited details | No specific reference | No | 2 |
    | General reference | Formal board consideration | Yes | 7 |
    | General reference | Formal board consideration | No | 6 |
    | General reference | Formal board commtment with limited details | Yes | 4 |
    | General reference | Formal board commtment with limited details | No | 4 |
    | General reference | General reference | Yes | 4 |
    | General reference | General reference | No | 3 |
    | General reference | No specific reference | Yes | 3 |
    | General reference | No specific reference | No | 1 |
    | No reference | Formal board consideration | Yes | 6 |
    +---------------------------------------------+---------------------------------------------+------+-------+


    Objective: Using columns 5283, 5288 and 5318, I need to add the Score value to DF1 as a new column.

    What I tried: I tried adding a new combined column to both dfs and use it as a merge index, but still, the Score column values in DF always end up as nan:

    Gov_JT_pivot['merge_key'] = tuple(zip(Gov_JT_pivot['5283'], Gov_JT_pivot['5288'], Gov_JT_pivot['5318']))
    Gov_lookup_df['merge_key'] = tuple(zip(Gov_lookup_df['5283'], Gov_lookup_df['5288'], Gov_lookup_df['5318']))

    # Perform the merge using the combined key
    Gov_JT_pivot= pd.merge(Gov_JT_pivot, Gov_lookup_df[['merge_key', 'SCORE']], on='merge_key', how='left')


    Which results in:

    +-------+---------------------------------------------+---------------------------------------------+------+------------------------------------------------------------------------------------------------------+-------+
    | AGENT | 5283 | 5288 | 5318 | merge_key | SCORE |
    +-------+---------------------------------------------+---------------------------------------------+------+------------------------------------------------------------------------------------------------------+-------+
    | 33 | No | No | No | ('No', 'No', 'No') | |
    | 34 | Yes, formal discussion | General reference | No | ('Yes, formal discussion', 'General reference', 'No') | |
    | 55 | No | No | No | ('No', 'No', 'No') | |
    | 129 | No | No | No | ('No', 'No', 'No') | |
    | 307 | No | No | No | ('No', 'No', 'No') | |
    | 441 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 522 | Yes, specific reference but limited details | Formal board commtment with limited details | No | ('Yes, specific reference but limited details', 'Formal board commtment with limited details', 'No') | |
    | 690 | No | No | No | ('No', 'No', 'No') | |
    | 749 | Yes, formal discussion | General reference | No | ('Yes, formal discussion', 'General reference', 'No') | |
    | 1011 | No | No | No | ('No', 'No', 'No') | |
    | 1067 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 1272 | No | No | No | ('No', 'No', 'No') | |
    | 1592 | No | No | No | ('No', 'No', 'No') | |
    | 1908 | Yes, formal discussion | Formal board commtment with limited details | No | ('Yes, formal discussion', 'Formal board commtment with limited details', 'No') | |
    | 1949 | No | No | No | ('No', 'No', 'No') | |
    | 2040 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 2102 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 2114 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 2266 | Yes, formal discussion | Formal board commtment with limited details | No | ('Yes, formal discussion', 'Formal board commtment with limited details', 'No') | |
    | 2365 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 2674 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 3109 | No | General reference | No | ('No', 'General reference', 'No') | |
    | 3170 | Yes, specific reference but limited details | Formal board commtment with limited details | No | ('Yes, specific reference but limited details', 'Formal board commtment with limited details', 'No') | |
    | 3295 | Yes, specific reference but limited details | Formal board commtment with limited details | No | ('Yes, specific reference but limited details', 'Formal board commtment with limited details', 'No') | |
    | 3323 | General reference | General reference | No | ('General reference', 'General reference', 'No') | |
    | 3366 | Yes, specific reference but limited details | Formal board consideration | No | ('Yes, specific reference but limited details', 'Formal board consideration', 'No') | |
    | 3840 | General reference | Formal board commtment with limited details | No | ('General reference', 'Formal board commtment with limited details', 'No') | |
    | 3914 | Yes, specific reference but limited details | Formal board commtment with limited details | No | ('Yes, specific reference but limited details', 'Formal board commtment with limited details', 'No') | |
    | 3967 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 4108 | No | No | No | ('No', 'No', 'No') | |
    | 4525 | Yes, specific reference but limited details | Formal board commtment with limited details | No | ('Yes, specific reference but limited details', 'Formal board commtment with limited details', 'No') | |
    | 4528 | General reference | No | No | ('General reference', 'No', 'No') | |
    | 4608 | Yes, formal discussion | Formal board consideration | No | ('Yes, formal discussion', 'Formal board consideration', 'No') | |
    | 4641 | No | No | No | ('No', 'No', 'No') | |
    | 4650 | No | Formal board consideration | No | ('No', 'Formal board consideration', 'No') | |
    +-------+---------------------------------------------+---------------------------------------------+------+------------------------------------------------------------------------------------------------------+-------+


    Question: What am I doing incorrectly and how to fix it?

    Continue reading...

Compartilhe esta Página