3

I've a problem with merging 2 dataframe with multiple index in dataframe1 and single index in dataframe2. I have dataframe1

ID    description
1          A
1          B
1          C
2          D
2          E

dataframe2

ID     price
1       100
2       50 

expected output

ID    description    price
1         A           100
1         B           NaN
1         C           NaN
2         D           50
2         E           NaN

Thank you and sorry for my English.

1 Answer 1

3

you can use .loc with a boolean to drop duplicates and use map to find the values from df2

This approach assumes you only have one target column.

df1.loc[df1.drop_duplicates(subset=['ID'],keep='first').index, 
                            'price'] =  df1['ID'].map(df2.set_index('ID')['price'])


   ID description  price
0   1           A  100.0
1   1           B    NaN
2   1           C    NaN
3   2           D   50.0
4   2           E    NaN

.groupby('id').cumcount() & .merge

Another, more dynamic method would be to create a sequence on your ID then join on both keys.

df1['sequence'] = df1.groupby('ID').cumcount()
df2['sequence'] = df2.groupby('ID').cumcount()

df3 = pd.merge(df1,df2,on=['ID','sequence'],how='left').drop('sequence',1)

   ID description  price
0   1           A  100.0
1   1           B    NaN
2   1           C    NaN
3   2           D   50.0
4   2           E    NaN

print(df1)

   ID description  sequence
0   1           A         0
1   1           B         1
2   1           C         2
3   2           D         0
4   2           E         1

print(df2)

   ID  price  sequence
0   1    100         0
1   2     50         0
Sign up to request clarification or add additional context in comments.

2 Comments

Is there any way to hide 'sequence' using second approach?
@jong-hyeon-yeo yep, I've left it commented out, but you could .drop it on the merge I've left it in so OP understands logic of the merge

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.