Reputation: 3751
I have a one:many dictionary. I would like to map the values of a pandas Dataframe column to the keys (NOT values) of the dictionary. here is my dictionary:
dict1={'fruits':('apple','grapes','oranges'),'food':('fish','meat','fibre')}
And here is the pandas Series object:
df=pd.Series(['fish','apple','meat'])
the desired output i want:
0 food
1 fruits
2 food
dtype: object
Upvotes: 10
Views: 7815
Reputation: 109726
What if 'other' was in both 'fruits' and 'food'? That is why you cannot do a reverse lookup without having some sort of logic to resolve duplicates.
If your values are all unique, then you can reverse your dictionary using a dictionary comprehension:
reversed_dict = {val: key for key in dict1 for val in dict1[key]}
>>> reversed_dict
{'apple': 'fruits',
'fibre': 'food',
'fish': 'food',
'grapes': 'fruits',
'meat': 'food',
'oranges': 'fruits'}
You could then map.
>>> pd.Series(['fish','apple','meat']).map(reversed_dict)
0 food
1 fruits
2 food
dtype: object
Upvotes: 10
Reputation: 294516
df.apply(lambda x: [k for k in dict1 if x in dict1[k]][0])
Upvotes: 1