我正在使用婴儿的名字数据源。数据是这样的
name sex births year
Mary F 7065 1880
Anna F 2604 1880
Emma F 2003 1880
...
Zariyan M 5 2016
Zarren M 5 2016
Zaryn M 5 2016
目的是过滤并仅获得2011年及以后的年份。然后,汇总重复项,按性别分组并按降序排序。输出是这个。
sex name births
F Emma 121375
F Sophia 117352
F Olivia 111691
F Isabella 103947
F Ava 94507
M Noah 110280
M Mason 105104
M Jacob 104722
M Liam 103250
M William 99144
我设法做到了,但是我的代码确实效率低下且乏味。应该有更好的方法来做到这一点,但我不知道如何做。这是我的代码。
bnames_2010 = bnames.loc[bnames['year'] > 2010]
a = bnames_2010.groupby(['sex', 'name'], sort=False)['births'].sum().reset_index()
b = a.sort(['sex', 'births'], ascending=False)
c = b.groupby('sex').head()
bnames_top5 = c.sort('sex')
print('bnames_top5')
最佳答案
您排序的次数过多。此外,groupby
还会执行排序,从而使以前的排序无效。这是我的做法-
df = df.query("year >= 2011")\
.groupby(['name', 'sex'], sort=False, as_index=False))\
.births.sum()\
.sort_values(['sex', 'births'], ascending=[True, False])
.groupby('sex', sort=False)\
.head(5)\
query
上的year
过滤器groupby
将按name
和sex
分组,并防止对结果进行排序sum
将按组求和birth
sort_values
将按sex
升序和出生降序对结果进行排序。另一个
groupby
+ head
调用按sex
检索前5行(可选)