0

I have a dataframe like this:

df = pd.DataFrame(index=[1,2,3,4,5,6,7,8,9,10,11,12])
df['group'] = [1,1,1,1,1,1,2,2,2,2,2,2]
df['Sex'] = ['male', 'female','male', 'male','male', 'female','male', 'male','male', 'female','female', 'female',]

df

    group   Sex
1      1    male
2      1    female
3      1    male
4      1    male
5      1    male
6      1    female
7      2    male
8      2    male
9      2    male
10     2    female
11     2    female
12     2    female

Each group has 6 people in it. Some are male, some are female. I want to get a dataframe which counts for every group in group the number of males and the number of females.

For example:

  • group 1 --> 4 male, 2 female
  • group 2 --> 3 male, 3 female

The details on how the result is presented is not important to me. I have tried to use groupby, but there is no function (count, sum, mean, nunique...) which tells me the ratio between male and female.

Hope you can help me!

PParker
  • 1,419
  • 2
  • 10
  • 25

2 Answers2

3

Use crosstab:

pd.crosstab(df['group'], df['Sex'])
Sex    female  male
group              
1           2     4
2           3     3
Henry Ecker
  • 34,399
  • 18
  • 41
  • 57
2

Use groupby() method ,value_counts() method and unstack() method:

result=df.groupby('group')['Sex'].value_counts().unstack()

Now If you print result you will get:

Sex     female  male
group       
1       2       4
2       3       3
Anurag Dabas
  • 23,866
  • 9
  • 21
  • 41