Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Insert values into columns without NaN

Tags:

python

pandas

I`m trying to calculate count of some values in data frame like

user_id  event_type
    1         a   
    1         a  
    1         b
    2         a
    2         b
    2         c

and I want to get table like

user_id  event_type  event_type_a  event_type_b  event_type_c
    1         a           2              1             0
    1         a           2              1             0
    1         b           2              1             0
    2         a           1              1             1
    2         b           1              1             1
    2         c           1              1             1

I`ve tried code like

df[' event_type_a'] = df['user_id', 'event_type'].where(df['event_type']=='a').groupby([user_id]).count()

and get table like

user_id    count_a
   1          2
   2          1

How i should insert this values into default df, to fill all rows without NaN items?

Maybe exsists method like, for exaple, "insert into df_1['column'] from df_2['column'] where df_1['user_id'] == df_1['user_id'] "

like image 312
Wittgenstein Avatar asked Jan 28 '23 00:01

Wittgenstein


1 Answers

Use crosstab with add_prefix for new columns names and join:

df2 = pd.crosstab(df['user_id'],df['event_type'])
#alternatives
#df2 = df.groupby(['user_id','event_type']).size().unstack(fill_value=0)
#df2 = df.pivot_table(index='user_id', columns='event_type', fill_value=0, aggfunc='size')

df = df.join(df2.add_prefix('event_type_'), on='user_id')
print (df)
   user_id event_type  event_type_a  event_type_b  event_type_c
0        1          a             2             1             0
1        1          a             2             1             0
2        1          b             2             1             0
3        2          a             1             1             1
4        2          b             1             1             1
5        2          c             1             1             1
like image 56
jezrael Avatar answered Jan 29 '23 12:01

jezrael