1

I have a mapper as follows

MAPPER = {
    'g': ['gm', 'gram', 'grams', 'gms'],
    'ml': ['mls', 'milli-litre', 'mili-litre', 'milli litre', 'mili litre'],
    'kg': ['kilo', 'kilo-gram', 'kilo gram', 'kilo grams'] 
}

and a pandas series as follows

Salt 500 gm
Sugar Powder 500 gm
Sugar 500 gm
Flour 500 gm
Repellent 10 mls

I want to change the gm and mls to the key from the mapper such that the result is as follows

Salt 500 g
Sugar Powder 500 g
Sugar 500 g
Flour 500 g
Repellent 10 ml

How do I go about doing this?

2 Answers 2

2

First flatten nested list of dict to dictonary with words boundaries and pass to Series.replace:

s = s.replace({rf'\b{x}\b': k  for k, v in MAPPER.items() for x in v}, regex=True)
print (s)
0            Salt 500 g
1    Sugar Powder 500 g
2           Sugar 500 g
3           Flour 500 g
4       Repellent 10 ml
Name: a, dtype: object

If need always repalce unit if last part of strings add $ for match end of strings:

s = s.replace({rf'\b{x}\b$': k  for k, v in MAPPER.items() for x in v}, regex=True)
Sign up to request clarification or add additional context in comments.

Comments

1

One approach:

MAPPER = {
    'g': ['gm', 'gram', 'grams', 'gms'],
    'ml': ['mls', 'milli-litre', 'mili-litre', 'milli litre', 'mili litre'],
    'kg': ['kilo', 'kilo-gram', 'kilo gram', 'kilo grams']
}

lookup = { v : k for k, vs in MAPPER.items() for v in vs }
res = ser.str.replace(rf"\b({'|'.join(lookup)})\b", lambda x: lookup[x.group()], regex=True)
print(res)

Output

0            Salt 500 g
1    Sugar Powder 500 g
2           Sugar 500 g
3           Flour 500 g
4       Repellent 10 ml
Name: 0, dtype: object

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.