Reputation: 7977
I have two dataframes, df1
and df2
import pandas as pd
df1 = pd.DataFrame([["name_"+str(i) for i in range(10)], list(range(10))]).transpose()
df1.columns = ["Name", "Score"]
df2 = pd.DataFrame([["name_"+str(i) for i in range(2,7)], list(range(12,17))]).transpose()
df2.columns = ["Name", "Score"]
I want to join the dataframes such that all rows that are in df1
are present in the result but wherever the Name
values in df1
are present in df2
, the result should contain values from df2
. Essentially, I want to update df1
with values from df2
wherever the Name
the matches
This is what I am looking for
Name Score
0 name_0 0
1 name_1 1
2 name_2 12
3 name_3 13
4 name_4 14
5 name_5 15
6 name_6 16
7 name_7 7
8 name_8 8
9 name_9 9
Is there a way I can do this operation using a join operation. I was able to do this using an assignment operation
df1.loc[df1['Name'].isin(df2['Name']), "Score"] = df2["Score"].values
Is there a way I can do this using a join operation?
Upvotes: 1
Views: 36
Reputation: 862921
One idea is use DataFrame.update
:
df1 = df1.set_index('Name')
df2 = df2.set_index('Name')
df1.update(df2)
df1 = df1.reset_index()
print (df1)
Name Score
0 name_0 0
1 name_1 1
2 name_2 12
3 name_3 13
4 name_4 14
5 name_5 15
6 name_6 16
7 name_7 7
8 name_8 8
9 name_9 9
Is there a way I can do this using a join operation?
Yes, you can join together and then replace missing values with Series.fillna
and DataFrame.pop
for extract column:
df = df1.join(df2.set_index('Name'), on='Name', lsuffix='_')
#merge alternative
#df = df1.merge(df2, on='Name', how='left', suffixes=('_', ''))
df['Score'] = df['Score'].fillna(df.pop('Score_'))
print (df)
Name Score
0 name_0 0
1 name_1 1
2 name_2 12
3 name_3 13
4 name_4 14
5 name_5 15
6 name_6 16
7 name_7 7
8 name_8 8
9 name_9 9
Upvotes: 1