我正在使用婴儿的名字数据源。数据是这样的
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')
答案 0 :(得分:2)
你排序太多次了。此外,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行(可选)