assigning individual words to the key in a row in a dataframe

Viewed 30

Let's say I have a dataset that has these data in Python DataFrame

              Title                       |   Category
Harry Potter and the Sorcerer's Stone     |    Fiction   
The Matrix Movie series                   |    Sci-Fi
Diary of a Wimpy Kid                      |    Comics

Is there a way that I can assign the individual words in the Title as dictionary keys and the category as values in python coding?

For example:

Harry: Fiction
Potter: Fiction
and: Fiction
the: Fiction
Sorcerer's: Fiction
Stone: Fiction
                       
1 Answers

Use DataFrame.assign with DataFrame.explode for separate each word and then convert to dictionary:

d = df.assign(Title = df['Title'].str.split()).explode('Title').set_index('Title')['Category'].to_dict()

print (d)
{'Harry': 'Fiction', 'Potter': 'Fiction', 'and': 'Fiction', 'the': 'Fiction', "Sorcerer's": 'Fiction', 'Stone': 'Fiction', 
 'The': 'Sci-Fi', 'Matrix': 'Sci-Fi', 'Movie': 'Sci-Fi', 'series': 'Sci-Fi',
 'Diary': 'Comics', 'of': 'Comics', 'a': 'Comics', 'Wimpy': 'Comics', 'Kid': 'Comics'}

Or use dict comprehension:

d = {x:b for a, b in zip(df['Title'], df['Category']) for x in a.split()}
print (d)
{'Harry': 'Fiction', 'Potter': 'Fiction', 'and': 'Fiction', 'the': 'Fiction', "Sorcerer's": 'Fiction', 'Stone': 'Fiction', 
 'The': 'Sci-Fi', 'Matrix': 'Sci-Fi', 'Movie': 'Sci-Fi', 'series': 'Sci-Fi', 
 'Diary': 'Comics', 'of': 'Comics', 'a': 'Comics', 'Wimpy': 'Comics', 'Kid': 'Comics'}

EDIT:

First each dictionary has unique key, so by default are duplicated values lost or processing some aggragation - here is used join:

print (df)
                                   Title Category
0  Harry Potter and the Sorcerer's Stone  Fiction
1                The Matrix Movie series   Sci-Fi
2                   Diary of a Wimpy Kid   Comics
3                         Diary of a Kid   Sci-Fi

d1 = df.assign(Title = df['Title'].str.split()).explode('Title').groupby('Title', sort=False)['Category'].agg(', '.join).to_dict()

print (d1)
{'Harry': 'Fiction', 'Potter': 'Fiction', 'and': 'Fiction', 'the': 'Fiction', "Sorcerer's": 'Fiction', 'Stone': 'Fiction', 
 'The': 'Sci-Fi', 'Matrix': 'Sci-Fi', 'Movie': 'Sci-Fi', 'series': 'Sci-Fi', 
  'Diary': 'Comics, Sci-Fi', 'of': 'Comics, Sci-Fi', 'a': 'Comics, Sci-Fi', 
  'Wimpy': 'Comics',
  'Kid': 'Comics, Sci-Fi'}

For compare:

d = df.assign(Title = df['Title'].str.split()).explode('Title').set_index('Title')['Category'].to_dict()
print (d)
{'Harry': 'Fiction', 'Potter': 'Fiction', 'and': 'Fiction', 'the': 'Fiction', "Sorcerer's": 'Fiction', 'Stone': 'Fiction', 
 'The': 'Sci-Fi', 'Matrix': 'Sci-Fi', 'Movie': 'Sci-Fi', 'series': 'Sci-Fi', 'Diary': 'Sci-Fi', 'of': 'Sci-Fi', 'a': 'Sci-Fi', 
 'Wimpy': 'Comics', 
 'Kid': 'Sci-Fi'}

d = {x:b for a, b in zip(df['Title'], df['Category']) for x in a.split()}
print (d)
{'Harry': 'Fiction', 'Potter': 'Fiction', 'and': 'Fiction', 'the': 'Fiction', "Sorcerer's": 'Fiction', 'Stone': 'Fiction', 
 'The': 'Sci-Fi', 'Matrix': 'Sci-Fi', 'Movie': 'Sci-Fi', 'series': 'Sci-Fi', 'Diary': 'Sci-Fi', 'of': 'Sci-Fi', 'a': 'Sci-Fi',
 'Wimpy': 'Comics', 
 'Kid': 'Sci-Fi'}
Related