Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas new column using a existing column and a dictionary

I have a data frame that looks like:

df = pd.DataFrame({"user_id" : ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
                   "score" : [0, 100, 50, 0, 25, 50, 100, 0, 7, 20],
                  "valval" : ["va2.3", "va1.1", "va2.1", "va2.2", "va1.2",
                             "va1.1", "va2.1", "va1.2", "va1.2", "va1.3"]})
   
print(df)


     | user_id | score | valval 
-----+---------+-------+--------
 0   |     a   |    0  | va2.3  
 1   |     b   |  100  | va1.1  
 2   |     c   |   50  | va2.1  
 3   |     d   |    0  | va2.2  
 4   |     e   |   25  | va1.2  
 5   |     f   |   50  | va1.1  
 6   |     g   |  100  | va2.1  
 7   |     h   |    0  | va1.2  
 8   |     i   |    7  | va1.2  
 9   |     j   |   20  | va1.3  

I also have a dictionary that looks like:

dic_t = { "key1" : ["va1.1", "va1.2", "va1.3"], "key2" : ["va2.1", "va2.2", "va2.3"]}

I want a new column "keykey".

This column´s values have the key of the dictionary of their corresponding value.

The result would look something like this:

     | user_id | score | valval | keykey 
----------------------------------------
 0   |     a   |    0  | va2.3  | key2
 1   |     b   |  100  | va1.1  | key1
 2   |     c   |   50  | va2.1  | key2
 3   |     d   |    0  | va2.2  | key2
 4   |     e   |   25  | va1.2  | key1
 5   |     f   |   50  | va1.1  | key1
 6   |     g   |  100  | va2.1  | key2
 7   |     h   |    0  | va1.2  | key1
 8   |     i   |    7  | va1.2  | key1
 9   |     j   |   20  | va1.3  | key1
like image 558
KDIC92 Avatar asked Nov 30 '25 18:11

KDIC92


1 Answers

You can use series.map after flattening the dictionary;

d = {val:k for k,v in dic_t.items() for val in v}
df['keykey'] = df['valval'].map(d)

print(df)

  user_id  score valval keykey
0       a      0  va2.3   key2
1       b    100  va1.1   key1
2       c     50  va2.1   key2
3       d      0  va2.2   key2
4       e     25  va1.2   key1
5       f     50  va1.1   key1
6       g    100  va2.1   key2
7       h      0  va1.2   key1
8       i      7  va1.2   key1
9       j     20  va1.3   key1
like image 58
anky Avatar answered Dec 02 '25 08:12

anky