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

问题描述 投票:2回答:1

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

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')
python performance pandas dataframe optimization
1个回答
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行(可选)
© www.soinside.com 2019 - 2024. All rights reserved.