def perform_join(fr_1, fr_2, keys=['key1', 'key2']):
    fr_1 = index_set(fr_1)
frame_2 = index_set(fr_2)
frame = fr_1.join(fr_2, how='outer').reset_index()
cat_fr_1 = pd.concat([frame, nulls(fr_1)]).drop_duplicates(keys, keep=False
    ).fillna(0)
cat_fr_2 = pd.concat([frame, nulls(fr_2)]).drop_duplicates(keys, keep=False
    ).fillna(0)
fr_1_join = frame.combine_first(frame.fillna(cat_fr_1[fr_1.columns]))
joined_frame = fr_1_join.combine_first(frame.fillna(cat_fr_2[fr_2.columns]))
return joined_frame
О значении по умолчанию/заполнении для *многоключевых* внешних объединений