join только одной колонки по условию

Первый фрейм:

df = pd.DataFrame({'column1': ['name1', 'name2', 'name3'],
                   'column2': ['condition_1', 'condition_2', 'condition_3']})

Второй фрейм:

df_2 = pd.DataFrame({'column1': ['name1', 'name2', 'name3','name3'],
                     'condition_1': [1000, 2000, 3000, 3000],
                     'condition_2': [10000, 20000, 30000, 30000],
                     'condition_3': [100000, 200000, 300000, 300000]})

Итог первый:

  column1      column2
0   name1  condition_1
1   name2  condition_2
2   name3  condition_3

Итог второй:

  column1  condition_1  condition_2  condition_3
0   name1         1000        10000       100000
1   name2         2000        20000       200000
2   name3         3000        30000       300000
3   name3         3000        30000       300000

Задача: В первый фрейм данных в колонку Result записать значения из второго фрейма, по условию:

  • значение из column1 первого фрейма = значению из column1 второго фрейма
  • значение из column2 первого фрейма = колонка с соответствующим названием второго датафрейма
  • во втором фрейме намеренно задублированно name3, просто удалить дубликаты через drop я не могу по условия задачи, нужно просто взять первое совпадение, пропустив остальные

Хочу получить итог:

  column1      column2   Result
0   name1  condition_1     1000
1   name2  condition_2    20000
2   name3  condition_3   300000

Мое не работающее решение:

df_2.loc[:, :'condition_1']
df.loc[(df['column1']  == 'name1'), 'Result'] = df.join(df_2.set_index('column1'), on='column1')

Получаю такую ошибку:

cannot reindex from a duplicate axis


Ответы (2 шт):

Автор решения: MaxU
res = (df
       .merge(df_2
              .drop_duplicates()
              .set_index("column1")
              .stack()
              .reset_index()
              .rename(columns={"level_1":"column2"})))

результат:

In [112]: res
Out[112]: 
  column1      column2       0
0   name1  condition_1    1000
1   name2  condition_2   20000
2   name3  condition_3  300000
→ Ссылка
Автор решения: splash58
df['res']= df_2.loc[~df_2['column1'].duplicated(keep='first')]
    .set_index('column1')
    .lookup(df['column1'], df['column2'])

>>> df
       
  column1      column2     res
0   name1  condition_1    1000
1   name2  condition_2   20000
2   name3  condition_3  300000
→ Ссылка