Reputation: 683
This is my two dataframe ,
df1 = pd.DataFrame([['@1','A',2],['@2','A',1],['@3','A',4],['@4','B',1],['@5','B',1],['@6','B',3],['@7','B',3],['@8','C',4]],columns=['key1','key2','value'])
key1 key2 value
0 @1 A 2
1 @2 A 1
2 @3 A 4
3 @4 B 1
4 @5 B 1
5 @6 B 3
6 @7 B 3
7 @8 C 4
df2 = pd.DataFrame([['@5','B',None],['@7','B',None],['@6','B',None],['@3','A',None],['@6','B',None]],columns=['key1','key2','value'])
key1 key2 value
0 @5 B None
1 @7 B None
2 @6 B None
3 @3 A None
4 @6 B None
I know I can use isin
to select the df1's rows where key1+key2 is in the df2
df1[(df1['key1']+df1['key2']).isin(df2['key1']+df2['key2'])]
key1 key2 value
2 @3 A 4
4 @5 B 1
5 @6 B 3
6 @7 B 3
but how can I assign df1's ['value'] to df2 , so that let df2 is
key1 key2 value
0 @5 B 1
1 @7 B 3
2 @6 B 3
3 @3 A 4
4 @6 B 3
Upvotes: 1
Views: 118
Reputation: 323396
Or you can using fillna
df2.set_index(['key1','key2']).value.fillna(df1.set_index(['key1','key2']).value).\
reset_index()
Out[84]:
key1 key2 value
0 @5 B 1
1 @7 B 3
2 @6 B 3
3 @3 A 4
4 @6 B 3
Upvotes: 2
Reputation: 294546
Use pd.DataFrame.merge
df2[['key1', 'key2']].merge(df1, 'left')
key1 key2 value
0 @5 B 1
1 @7 B 3
2 @6 B 3
3 @3 A 4
4 @6 B 3
Or with pd.DataFrame.join
keys = ['key1', 'key2']
df2[keys].join(df1.set_index(keys).value, on=keys)
key1 key2 value
0 @5 B 1
1 @7 B 3
2 @6 B 3
3 @3 A 4
4 @6 B 3
Supposing you want to update df2
while leaving other columns intact. You can update
in place
keys = ['key1', 'key2']
df2.update(df2[keys].join(df1.set_index(keys).value, on=keys).value)
Or create a copy
keys = ['key1', 'key2']
df2.assign(value=df2[keys].join(df1.set_index(keys).value, on=keys).value)
Upvotes: 2