我有出生数据,如下所示:
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
您可以group
列Date
和Country
上的数据帧,然后使用value_counts
聚合列Sex
,然后再使用unstack
进行整形,最后通过沿axis=1
:的频率求和来assign
列Births
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