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