Search code examples
pythonpandasdataframelookup

Looking up a column name in another data frame


I have the following data frame:

import pandas as pd

 df_1 = pd.DataFrame(
     {
         "id_1": [1, 1, 2, 2],
         "id_2": [11, 11, 22, 22],
         "value_1": [0.1, 0.1, 0.01, 0.01],
         "value_2": [0.2, 0.2, 0.02, 0.02],
         "value_3": [0.3, 0.3, 0.03, 0.03],
     }
 )

that looks like this:

    id_1  id_2  value_1  value_2  value_3
 0     1    11     0.10     0.20     0.30
 1     1    11     0.10     0.20     0.30
 2     2    22     0.01     0.02     0.03
 3     2    22     0.01     0.02     0.03

and another:

 df_2 = pd.DataFrame(
     {
         "id_1": [1, 1, 1, 1, 2, 2, 2, 2],
         "id_2": [11, 11, 11, 11, 22, 22, 22, 22],
         "value_name": [
             "value_1",
             "value_2",
             "value_3",
             "value_1",
             "value_1",
             "value_2",
             "value_3",
             "value_1",
         ],
     }
 )

which looks like this:

    id_1  id_2 value_name
 0     1    11    value_1
 1     1    11    value_2
 2     1    11    value_3
 3     1    11    value_1
 4     2    22    value_1
 5     2    22    value_2
 6     2    22    value_3
 7     2    22    value_1

How do I get the corresponding value (for a given id_1 and id_2) from df_1 into df_2, please? i.e. I want a final data frame should look like this:

    id_1  id_2 value_name value
 0     1    11    value_1   0.1
 1     1    11    value_2   0.2
 2     1    11    value_3   0.3
 3     1    11    value_1   0.1
 4     2    22    value_1  0.01
 5     2    22    value_2  0.02
 6     2    22    value_3  0.03
 7     2    22    value_1  0.01

Solution

  • drop the dupe rows by id columns then melt the dataframe and merge with df_2

    c = ['id_1', 'id_2']
    df_2.merge(df_1.drop_duplicates(c).melt(c, var_name='value_name'), how='left')
    

    Result

       id_1  id_2 value_name  value
    0     1    11    value_1   0.10
    1     1    11    value_2   0.20
    2     1    11    value_3   0.30
    3     1    11    value_1   0.10
    4     2    22    value_1   0.01
    5     2    22    value_2   0.02
    6     2    22    value_3   0.03
    7     2    22    value_1   0.01