The essence of the question is "creating a new column in the DataFrame", based on existing column 'user_id' and a dictionary {dict}, which holds as keys of a dictionary values of column 'user_id' and as values of the dictionary their types.
I have the following DataFrame df.
    df = pd.DataFrame({"user_id" : [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5], 
                  "value" : [0, 100, 50, 0, 25, 50, 100, 0, 7, 8, 20]})
    print(df)
     | user_id | value 
     _________________
0    |     1   |    0  
1    |     2   |  100  
2    |     2   |   50  
3    |     3   |    0  
4    |     3   |   25  
5    |     3   |   50  
6    |     4   |  100  
7    |     4   |    0  
8    |     4   |    7  
9    |     4   |    8  
10   |     5   |   20  
Also, I have a dictionary, which is
dict = {1 : 'type_a', 2: 'type_b', 3: 'type_a', 4: 'type_b', 5: 'type_a'}
My idea is to create a third column in my DataFrame df, which would be called tariff, so if I have a user_id 3 all rows in the DataFrame would have a tariff of type a.
I have found one solution, but i don't quite understand how it is implemented.
df['tariffs'] = df.apply(lambda x: dict[x.user_id], axis=1)
print(df)
     | user_id | value |
     _________________________
0    |     1   |    0  |type_a
1    |     2   |  100  |type_b
2    |     2   |   50  |type_b
3    |     3   |    0  |type_a
4    |     3   |   25  |type_a
5    |     3   |   50  |type_a
6    |     4   |  100  |type_b
7    |     4   |    0  |type_b
8    |     4   |    7  |type_b
9    |     4   |    8  |type_b
10   |     5   |   20  |type_a
The result i get after this line of code is exactly what I want
Especially I do not understand the part dict[x.user_id]
The question is are there any alternatives to the method I used. And what is the logic behind dict[x.user_id]. Thanks in advance