1

I got to know how to do this in R( How to make new columns by counting up an existing column), but I'd like also to know how it works in python as well.

When the original table is like below

 userID   cat1    cat2
    a        f       3
    a        f       3
    a        u       1
    a        m       1
    b        u       2
    b        m       1
    b        m       2

I group them by userID and want it come like

userID   cat1_f  cat1_m  cat1_u  cat2_1  cat2_2  cat2_3
a        2       1       1       2       0       1
b        0       2       1       1       2       0
user9191983
  • 505
  • 1
  • 4
  • 20

1 Answers1

3

Use melt with GroupBy.size and unstack:

df = (df.melt('userID')
        .groupby(['userID','variable','value'])
        .size()
        .unstack([1,2], fill_value=0))
#python 3.6+
df.columns = [f'{a}_{b}' for a, b in df.columns]
#python bellow
#df.columns = ['{}_{}'.format(a,b) for a, b in df.columns]
df = df.reset_index()
print (df)
RangeIndex(start=0, stop=7, step=1)
  userID  cat1_f  cat1_m  cat1_u  cat2_1  cat2_3  cat2_2
0      a       2       1       1       2       2       0
1      b       0       2       1       1       0       2

Alternative with crosstab:

df = df.melt('userID')
df = pd.crosstab(df['userID'], [df['variable'], df['value']])
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index()
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252