在python 2中通过聚合创建新变量



我有出生数据,如下所示:

Date    Country  Sex
1.1.20  USA      M
1.1.20  USA      M
1.1.20  Italy    F
1.1.20  England  M
2.1.20  Italy    F
2.1.20  Italy    M
3.1.20  USA      F
3.1.20  USA      F

我的目的是获得一个新的数据帧,其中每一行都是一个国家的日期,然后是总出生人数、男性出生人数和女性出生人数。应该是这样的:

Date    Country Births Males Females
1.1.20  USA     2      2     0
1.1.20  Italy   1      0     1
1.1.20  England 1      1     0
2.1.20  Italy   2      1     1
3.1.20  USA     2      0     2

我试着使用这个代码:

df.groupby(by=['Date', 'Country', 'Sex']).size()

但它只给了我一个新的出生总数栏,在每个日期+国家的组合中,每个性别都有不同的行。

任何帮助都将不胜感激。

谢谢,Eran

您可以groupDateCountry上的数据帧,然后使用value_counts聚合列Sex,然后再使用unstack进行整形,最后通过沿axis=1:的频率求和来assignBirths

out = df.groupby(['Date', 'Country'], sort=False)['Sex']
.value_counts().unstack(fill_value=0)
out.assign(Births=out.sum(1)).reset_index()
.rename(columns={'M': 'Male', 'F': 'Female'})

或者,您可以使用与.crosstab非常相似的方法,而不是groupby+value_counts:

out = pd.crosstab([df['Date'], df['Country']], df['Sex'], colnames=[None])
out.assign(Births=out.sum(1)).reset_index()
.rename(columns={'M': 'Male', 'F': 'Female'})

Date  Country  Female  Male  Births
0  1.1.20      USA       0     2       2
1  1.1.20    Italy       1     0       1
2  1.1.20  England       0     1       1
3  2.1.20    Italy       1     1       2
4  3.1.20      USA       2     0       2

最新更新