使用pandas执行分组聚合和排序的更好方法

时间:2017-12-25 13:37:16

标签: python performance pandas dataframe optimization

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

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')

1 个答案:

答案 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)\
  1. query过滤year
  2. groupby将按namesex分组,并会阻止结果排序
  3. sum将按小组birth加总
  4. sort_values会按照sex的升序和出生次数的降序对结果进行排序。
  5. 另一个groupby + head调用按sex检索前5行(可选)