Я думаю, что нужно для внутреннего соединения изменить df2
на stack
или melt
сначала, а затем merge
:
df = df.merge(df2.stack().reset_index(name='val1'), on=['user','visit_id'], how='left')
Альтернатива:
df = df.merge(df2.reset_index().melt('user', value_name='val1'), on=['user','visit_id'])
Или для левого соединения MultiIndex
:
print (df.tail())
val ts user visit_id
id
155 155 155 x 2.0
165 165 155 y 2.0
156 156 156 y1 2.0 <-change values of user for not match
166 166 163 x1 2.0 <-change values of user for not match
186 186 183 z1 2.0 <-change values of user for not match
#join together
df = df.join(df2.stack().rename('val'), on=['user','visit_id'], lsuffix='_')
#replace val column if match, else get values of original
df['val'] = df['val'].combine_first(df['val_'])
#remove original column val
df = df.drop('val_', axis=1)
print (df)
ts user visit_id val
id
1 1 x 0.0 0.0
21 1 z 0.0 0.0
71 1 y 0.0 0.0
2 2 x 0.0 0.0
22 2 z 0.0 0.0
.
.
.
160 150 y 2.0 56.0
180 150 z 2.0 56.0
150 150 x 2.0 56.0
185 155 z 2.0 56.0
155 155 x 2.0 56.0
165 155 y 2.0 56.0
156 156 y1 2.0 156.0
166 163 x1 2.0 166.0
186 183 z1 2.0 186.0