Вы можете создать фрейм данных из списка кортежей, а затем объединить дважды. например,
# Create df from list of tuples
tuple_df = pd.DataFrame(list_of_couples, columns=['a', 'b'])
# Merge table_a with tuples
merged = pd.merge(table_a, tuple_df, left_index=True, right_on='a')
# Merge result with table_b
merged = pd.merge(merged, table_b, right_index=True, left_on='b')
# Removing intermediate join columns
merged = merged.drop(['a','b'], axis=1)
>>> print(merged)
col_a col_b col_c col_d
0 1 2 9 8
1 1 1 3 3