Python中如何对pandas DataFrame按年分组统计各年份Top10姓名的计数
原有代码问题梳理
- 聚合函数误用:
groupby后调用count()是统计分组内的记录条数,你需要统计姓名对应的总计数,应该对number字段调用sum()做求和聚合 - 排序逻辑错误:
sort_values的ascending=True是从小到大升序排列,要取计数最高的前10,需要设置为降序ascending=False - 排序结果未生效:pandas的
sort_values默认不会修改原对象,要么加inplace=True参数,要么赋值给新变量接收排序后的结果 - 分组逻辑不符合需求:你的需求是统计指定年份的前10姓名,不需要把
year放进分组维度,直接提前过滤好指定年份的数据再按name分组即可
正确实现代码
单指定年份Top10统计(以2010年男性为例)
# 第一步:过滤指定年份+指定性别 target_year = 2010 target_sex = 'M' filtered_data = allyears[(allyears['year'] == target_year) & (allyears['sex'] == target_sex)] # 第二步:按姓名分组,对number字段求和得到总计数 name_counts = filtered_data.groupby('name')['number'].sum().reset_index() # 第三步:按总计数降序排序,取前10条 top10_names = name_counts.sort_values('number', ascending=False).head(10)
多年份各年Top10批量统计(以2010年之后所有年份为例)
# 过滤2010年及之后的男性数据 males = allyears[(allyears['year'] > 2009) & (allyears['sex'] == 'M')] # 按年份+姓名分组求和 year_name_counts = males.groupby(['year', 'name'])['number'].sum().reset_index() # 按年份分组,每组内按计数降序取前10 top10_per_year = year_name_counts.groupby('year', group_keys=False).apply( lambda x: x.sort_values('number', ascending=False).head(10) )
内容的提问来源于stack exchange,提问作者Satish
相关产品推荐
相关产品推荐

