Group by column and Spread values of another Column into other Columns

Viewed 523

I have the current dataframe and I'm trying to group by the Name and spread the values of weight into the columns and count each time they occur. Thanks!

df = pd.DataFrame({'Name':['John','Paul','Darren','John','Darren'],
'Weight':['Average','Below Average','Above Average','Average','Above Average']})

Desired output:

enter image description here

3 Answers

Try pandas crosstab :

pd.crosstab(df.Name, df.Weight)

Weight  Above Average   Average Below Average
Name            
John           0           2        0
Paul           0           0        1
Darren         2           0        0

use groupby and unstack:

    df = pd.DataFrame({'Name':['John','Paul','Darren','John','Darren'],
'Weight':['Average','Below Average','Above Average','Average','Above Average']})
df = df.groupby(['Name', 'Weight'])['Weight'].count().unstack(1).fillna(0).astype(int).reset_index()
df = df.rename_axis('', axis=1).set_index('Name')
df
Out[1]: 
        Above Average  Average  Below Average
Name                                         
Darren              2        0              0
John                0        2              0
Paul                0        0              1

Use get dummies to achieve what you need here

pd.get_dummies(df.set_index('Name'), dummy_na=False,prefix=[None]).groupby('Name').sum()
 

         Above Average  Average  Below Average
Name                                         
Darren              2        0              0
John                0        2              0
Paul                0        0              1
Related