dko512
dko512

Reputation: 431

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

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

Upvotes: 4

Views: 866

Answers (3)

sammywemmy
sammywemmy

Reputation: 28709

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

Upvotes: 3

wwnde
wwnde

Reputation: 26676

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

Upvotes: 1

David Erickson
David Erickson

Reputation: 16683

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

Upvotes: 1

Related Questions