Учитывая ваш MCVE:
import pandas as pd
base = pd.DataFrame([1,2,3], columns=['id'])
df1 = pd.DataFrame([[1,1]], columns=['id', 'value'])
df2 = pd.DataFrame([[2,2]], columns=['id', 'value'])
df3 = pd.DataFrame([[3,3]], columns=['id', 'value'])
Я бы предложил сначала объединить ваш фрейм данных (при необходимости используя цикл):
df = pd.concat([df1, df2, df3])
А затем объединить:
pd.merge(base, df, on='id')
Это дает:
id value
0 1 1
1 2 2
2 3 3
Обновление
Запуск кода с новой версией вашего вопроса и вводом, предоставленным @Celius Stingher
:
a = {'id':[1,2,3],'constrains':['a','b','c']}
b = {'id':[1,2,3],'value':[1,2,3],'constrains':['a','a','a']}
c = {'id':[1,2,3],'value':[1,2,3],'constrains':['b','b','b']}
d = {'id':[1,2,3],'value':[1,2,3],'constrains':['c','c','c']}
base = pd.DataFrame(a)
df1 = pd.DataFrame(b)
df2 = pd.DataFrame(c)
df3 = pd.DataFrame(d)
Мы получаем:
id constrains value
0 1 a 1
1 2 b 2
2 3 c 3
Что соответствует ожидаемому результату.