如何解决在 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()
但它只给了我一个新的总出生列,每个日期+国家组合中每个性别的行都不同。
任何帮助将不胜感激。
谢谢, 伊兰
解决方法
您可以group
列Date
和Country
上的数据框,然后使用Sex
和value_counts
聚合列unstack
以重塑,最后assign
Births
列,沿 axis=1
求和频率:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。