Replace values in dataframe using second dataframe as value map

Given the dataframe

df = pd.DataFrame({
    'a': [1, 2, 3, 4], 
    'b': [1, 2, 3, 4]
})

   a  b
0  1  1
1  2  2
2  3  3
3  4  4

For each column (‘a’, ‘b’), I want to replace the values based upon the following dataframe:

replace_value_map  = pd.DataFrame({
    'column_to_map': ['a', 'a', 'b', 'b'], 
    'to_replace':    [1,    2,   1,   3 ], 
    'replace_with':  ['x', 'y', 'z', 'x'], 

})

  column_to_map  to_replace replace_with
0             a           1            x
1             a           2            y
2             b           1            z
3             b           3            x

Giving:

  • For column a: replace 1 with ‘x’ and 2 with ‘y’
  • For column b: replace 1 with ‘z’ and 3 with ‘x’
    This is the expected result:
df_expected = pd.DataFrame({
    'a': ['x','y', 3, 4], 
    'b': ['z', 2,'x',4]
})

   a  b
0  x  z
1  y  2
2  3  x
3  4  4

>Solution :

You can make your replace map into dict , then just replace it

map_d = replace_value_map.groupby('column_to_map').apply(lambda x : x.set_index('to_replace')['replace_with'].to_dict()).to_dict()
df = df.replace(map_d)
Out[88]: 
   a  b
0  x  z
1  y  2
2  3  x
3  4  4

Leave a Reply