我正在使用婴儿的名字数据源。数据是这样的

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将按namesex分组,并防止对结果进行排序
sum将按组求和birth
sort_values将按sex升序和出生降序对结果进行排序。
另一个groupby + head调用按sex检索前5行(可选)

07-24 09:38
查看更多