Pandas按gender执行groupby统计时出现超过两个分组的问题如何解决
问题原因
当前写法的问题出在全局排序逻辑:
- 你调用
sort_values(ascending=False)是对所有(sex, title)组合的计数结果做全量降序排序,完全忽略了sex的层级优先级,最终会出现「M组计数第二的电影 < F组计数第一的电影」这类情况,自然就出现了sex列M、F交替排列的问题。 - groupby之后生成的MultiIndex虽然默认第一层为sex,但全局排序会直接打破这个层级的聚合顺序。
修复方案
方案1:分组内单独排序(逻辑更贴合需求)
先对sex做外层分组,每个性别组内部单独按评分次数降序排列,最终拼接结果自然会按sex的顺序聚合展示:
# 先统计每个性别下各电影的评分次数 count_df = lens.groupby(['sex', 'title']).size().reset_index(name='rating_count') # 按sex分组,每组内部按评分次数降序排序 most_rated_gen = count_df.groupby('sex', group_keys=False).apply( lambda x: x.sort_values('rating_count', ascending=False) ).set_index(['sex', 'title']) # 不需要MultiIndex结构可删除这行
方案2:排序时指定多字段优先级
如果不需要单独处理每组逻辑,也可以在排序时指定先按sex排序,再按计数值降序,保证sex相同的行聚合在一起:
most_rated_gen = lens.groupby(['sex','title']).size().reset_index(name='rating_count')\ .sort_values(by=['sex', 'rating_count'], ascending=[True, False])\ .set_index(['sex', 'title'])
设置sex为索引第一层后,pandas展示时会自动合并相同的第一层索引值,和你给出的示例输出效果一致。
内容的提问来源于stack exchange,提问作者kayak
相关产品推荐
相关产品推荐

